Java_字符编码(Unicode、UTF-8、UTF-16)

首先看一下下面的程序(测试英文和中文在Unicode、UTF-8、UTF-16这三种编码下,一个字符占几个字节)

    System.out.println("a(Unicode)    :" + "a".getBytes("Unicode").length);  
    System.out.println("a(Unicode)    :" + "aa".getBytes("Unicode").length);  
    System.out.println("啊(Unicode)   :" + "啊".getBytes("Unicode").length);  
    System.out.println("啊啊(Unicode) :" + "啊啊".getBytes("Unicode").length);  
    System.out.println("");  
    System.out.println("a(UTF-8)    :" + "a".getBytes("UTF-8").length);  
    System.out.println("aa(UTF-8)   :" + "aa".getBytes("UTF-8").length);  
    System.out.println("啊(UTF-8)   :" + "啊".getBytes("UTF-8").length);  
    System.out.println("啊啊(UTF-8) :" + "啊啊".getBytes("UTF-8").length);  
    System.out.println("");  
    System.out.println("a(UTF-16)    :" + "a".getBytes("UTF-16").length);  
    System.out.println("aa(UTF-16)   :" + "aa".getBytes("UTF-16").length);  
    System.out.println("啊(UTF-16)   :" + "啊".getBytes("UTF-16").length);  
    System.out.println("啊啊(UTF-16) :" + "啊啊".getBytes("UTF-16").length);  

运行结果如下:

a(Unicode) :4
a(Unicode) :6
啊(Unicode) :4
啊啊(Unicode) :6

a(UTF-8) :1
aa(UTF-8) :2
啊(UTF-8) :3
啊啊(UTF-8) :6

a(UTF-16) :4
aa(UTF-16) :6
啊(UTF-16) :4
啊啊(UTF-16) :6

可以看到UTF-8的情况:一个英文字符占一个字节,一个汉字占三个字节

但是Unicode和UTF-16的情况比较奇怪,不管是英文还是汉字,看不出占几个字节。其实正确的答案是:Unicode和UTF-16的编码下,不管是英文字符还是汉字字符,都占两个字节(至于上面结果中多出来的两个字节是用来表示字节顺序的默认字节)。至于为什么,继续往下看。

Unicode规范中推荐的标记字节顺序的方法是BOM。BOM不是“Bill Of Material”的BOM表,而是Byte Order Mark。

(Unicode是一种字符编码方法,不过它是由国际组织设计,可以容纳全世界所有语言文字的编码方案。Unicode的学名是”Universal Multiple-Octet Coded Character Set”,简称为UCS。UCS可以看作是”Unicode Character Set”的缩写。)

在UCS编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。

这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little-Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。

在 Java 中直接使用Unicode 转码时会按照UTF-16LE 的方式拆分,并加上 BOM。 如果采用 UTF-16 拆分,在 Java 中默认采用带有 BOM 的 UTF-16BE 拆分。

总上所述:

Unicode和UTF-16:1个字符占2个字节(不管是哪国语言)

UTF-8:1个英文字符占1个字节,一个汉字(包括日文和韩文等)占3个字节

Java中的char默认采用Unicode编码,所以Java中char占2个字节

另外,顺便提一个知识点:1个字节(byte)占8位(bit)总上所述:

[转载]http://blog.csdn.net/tianjf0514/article/details/7854624

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值