Unicode UTF-8 UTF-16的关系

以下仅为个人学习的记录,如有疏漏不妥之处,还请不吝赐教

关系 

  Unicode是一个字符集。顾名思义,字符的集合。GBK,BIG5,ISO8859-1,ASCII都是字符集。

  有一点不同的是,Unicode并没有规定字符的编码是如何实现的,上述的其它字符集有其编码方式。Unicode就好比java中的抽象类,实现编码的方法是抽象的。因此,需要实现编码方式才能应用于实际。UTF-8,UTF-16实现它编码方式。

UTF-8

  UTF-8是变长的。即字符编码的字节数有差异。比如"A"的编码0x41, 只需一个字节,"中"的编码是0xe4b8ad,则需要三个字节,大部分中文字符的编码都是三个字节。

UTF-8的编码方式

  

UTF-8编码 (参考wiki百科)
字节数

    起始

    码点

    终止

    码点

    字节1

    字节2    字节3    字节4
    1U+0000U+007F0xxxxxxx   
    2U+0080U+07FF110xxxxx10xxxxxx  
    3U+0800U+FFFF1110xxxx10xxxxxx10xxxxxx 
    4 U+10000U+1FFFFF11110xxx10xxxxxx10xxxxxx10xxxxxx

  以字符"中" 为例:

  1. 查找"中"字的Unicode 码点(code point), U+4e2d, 二进制码点表示为 0100 1110 0010 1101

  2. 因为U+0800 < U+4e2d < U+FFFF, 可知需要三个字节编码。

  3. 从右到左将二进制码点填写到xxx中。得到11100100 10111000 10101101 即0xe4b8ad.

UTF-16

  UTF-16开始时是定长的,后来也变长的,UTF-16使用两个或四个字节编码。java一开始选择UTF-16作为运行时的字符编码,是因为字符定长编码带来的字符操作便利。UTF-16中有一个术语代码(code unit)。编码时每16个位就是一个代码单元。用4个字节编码时,就是编码为两个代码单元。

UTF-16的编码方式

UTF-16编码
字节数    字节1    字节2     字节3   字节4
    2  xxxx xxxx   xxxx xxxx  
    4  1101 10xx   xxxx xxxx  1101 11xx   xxxx xxxx


  
还是以字符"中"为例:

  1.查找"中"字的Unicode 码点(code point), U+4e2d, 二进制码点表示为 0100 1110 0010 1101

  2.直接按照码点进行编码,得到0x4e2d.也就是说其实UTF-16的两个字节编码和Unicode的码点是完全一样的。

  

 总结

   UTF-8和UTF-16两种编码方式是不兼容的。

延伸阅读:

深入分析 Java 中的中文编码问题:  https://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/#icomments

字符编码笔记:ASCII,Unicode 和 UTF-8:http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

Wiki百科:https://en.wikipedia.org/wiki/UTF-16   

                  https://en.wikipedia.org/wiki/UTF-8

https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/

  

 

转载于:https://www.cnblogs.com/yvkm/p/10387002.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值