A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© QQ被盗 中级黑马   /  2013-11-28 21:44  /  2479 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天看毕老师的IO流视频,视频中说Unicode的字符都是两个字节,为甚么我用System.out.println("a".getBytes("Unicode").length);输出的却是4

5 个回复

倒序浏览
本帖最后由 贾波 于 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标志。

评分

参与人数 1技术分 +1 黑马币 +6 收起 理由
狼王 + 1 + 6 不错哦,谢谢你的回答

查看全部评分

回复 使用道具 举报 2 0
实际输出为 // 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

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 继续努力哈,谢谢。。。

查看全部评分

回复 使用道具 举报 1 0
谢啦,又让我了解到了,Unicode编码,一直以来都弄不清它
回复 使用道具 举报
楼上说的很对了,那两个多出来的字节是因为在unicode编码中,还要指定字节序,就是字节的顺序,大于一个字节的数据在内存中存放的的顺序。有两种,大字节序BIG-ENDIAN和小字节序LITTLE-ENDIAN.
传输协议中,需要先传一个标识,一个叫“ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在Unicode中是不存在的字符,所以不应该出现在实际传输中。unicode规范建议在传输字节流前,先传输字符"ZERO WIDTH NO-BREAK SPACE"。这样就多出了两个字节。
不信你换”ab“.getBytes()/length;输出就是6.还是多两位

评分

参与人数 1技术分 +1 黑马币 +3 收起 理由
狼王 + 1 + 3 赞一个!

查看全部评分

回复 使用道具 举报 1 0
胡永城 发表于 2013-11-28 22:50
实际输出为 // 0xfe 0xff 0x00 0x31

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

大哥,看来下你的博客,让我感触很深啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马