黑马程序员技术交流社区

标题: 为什么"a".getBytes("Unicode").length输出的是4 [打印本页]

作者: QQ被盗    时间: 2013-11-28 21:44
标题: 为什么"a".getBytes("Unicode").length输出的是4
今天看毕老师的IO流视频,视频中说Unicode的字符都是两个字节,为甚么我用System.out.println("a".getBytes("Unicode").length);输出的却是4


作者: 贾波    时间: 2013-11-28 22:26
本帖最后由 贾波 于 2013-11-28 22:29 编辑
  1. public class Test {

  2.         public static void main(String[] args) {
  3.                 try {
  4.                         byte[] unicodes = "a".getBytes("Unicode");

  5.                         System.out.println("unicodes=" + unicodes.length);
  6.                         for (int i = 0; i < unicodes.length; i++) {
  7.                                 System.out.println(unicodes[i]);
  8.                         }
  9.                 } catch (UnsupportedEncodingException e) {
  10.                         // TODO Auto-generated catch block
  11.                         e.printStackTrace();
  12.                 }
  13.         }
  14. }
复制代码
输出结果:
unicodes=4
-2
-1
0
97

在 Java 中直接使用 Unicode 转码时会按照 UTF-16LE 的方式拆分,并加上 BOM。
Unicode一个字符占两个字节。-2,-1是一个字节的BOM标志。

作者: 胡永城    时间: 2013-11-28 22:50
实际输出为 // 0xfe 0xff 0x00 0x31
  1. /**
  2.                          * UNICODE 是一种字符集,在 Java 中直接使用 Unicode 转码时会按照 UTF-16LE 的方式拆分,由于
  3.                          * UTF-16 分为 UTF-16LE 和 UTF-16BE,也就是小端序和大端序,因此在网络传过程中,无法判断是 LE 还是 BE
  4.                          * 序的,因此需要加上一个额外的字节序 BOM 头。
  5.                          *
  6.                          * BOM 头的字符是一个特殊的字符,其 Unicode 编码为 U+FEFF,字符名为“ZERO WIDTH
  7.                          * NON-BREAKING SPACE”,根据 RFC2781 3.2 节规定,开头两个字节为 FE FF 的称为
  8.                          * Big-Endian,开头为 FF FE 的称为 Little-Endian。
  9.                          *
  10.                          * 因此,你直接使用 Unicode 转换字节的话,也就是按 UTF-16LE 方式进行解码,会额外地加上 BOM 的两个字节 FF
  11.                          * FE。
  12.                          */
复制代码

详细的解释见: http://blog.csdn.net/lipeijs3/article/details/5062243

http://bbs.csdn.net/topics/270062448
作者: QQ被盗    时间: 2013-11-28 22:54
谢啦,又让我了解到了,Unicode编码,一直以来都弄不清它
作者: ysunday    时间: 2013-11-28 23:04
楼上说的很对了,那两个多出来的字节是因为在unicode编码中,还要指定字节序,就是字节的顺序,大于一个字节的数据在内存中存放的的顺序。有两种,大字节序BIG-ENDIAN和小字节序LITTLE-ENDIAN.
传输协议中,需要先传一个标识,一个叫“ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在Unicode中是不存在的字符,所以不应该出现在实际传输中。unicode规范建议在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样就多出了两个字节。
不信你换”ab“.getBytes()/length;输出就是6.还是多两位
作者: QQ被盗    时间: 2013-11-29 09:14
胡永城 发表于 2013-11-28 22:50
实际输出为 // 0xfe 0xff 0x00 0x31

详细的解释见: http://blog.csdn.net/lipeijs3/article/details/5062 ...

大哥,看来下你的博客,让我感触很深啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2