zoukankan      html  css  js  c++  java
  • 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
        1 U+0000 U+007F 0xxxxxxx      
        2 U+0080 U+07FF 110xxxxx 10xxxxxx    
        3 U+0800 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx  
        4  U+10000 U+1FFFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

      以字符"中" 为例:

      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/

      

  • 相关阅读:
    PHP把数组按指定的个数分隔
    主题模型(LDA)(一)--通俗理解与简单应用
    用户活跃度下降40%!七问新浪微博
    天才罗素:知识面横跨哲学 数学和文学 最懂的却是女人
    金刚经---现代解读
    离散数学
    交易已无秘密 一个期货高手的终极感悟
    一位资深交易员的投资感悟(建议收藏)
    F1 score,micro F1score,macro F1score 的定义
    以前曾看到过一个期货童话故事,很有意思,发上来
  • 原文地址:https://www.cnblogs.com/yvkm/p/10387002.html
Copyright © 2011-2022 走看看