https://github.com/acmerfight/insight_python/blob/master/Unicode_and_Character_Sets.md
总结
1. 简单字符集
ascii是简单字符集,7bit表示;简单字符集的特点是定义了这个字符集包含什么字符,**同时把每个字符如何对应成计算机里的比特也进行了定义。**例如 ASCII,在 ASCII 里直接定义了 A -> 0100 0001。
2.现代编码模型
在现代编码模型里要知道一个字符如何映射成计算机里比特,需要经过如下几个步骤:
知道一个系统需要支持哪些字符,这些字符的集合被称为字符表(Character repertoire)
给字符表里的抽象字符编上一个数字,也就是字符集合到一个整数集合的映射。这种映射称为编码字符集(CCS:Coded Character Set), unicode 是属于这一层的概念,unicode 跟计算机里的什么进制啊没有任何关系,它是完全数学的抽象的。
将 CCS 里字符对应的整数**转换成有限长度的比特值,**便于以后计算机使用一定长度的二进制形式表示该整数。这个对应关系被称为字符编码表(CEF:Character Encoding Form)UTF-8, UTF-16 都属于这层。
另外:UTF-8是完全兼容原来的Ascii的,就是说UTF-8的0-127就是ASCII字符集的编码。 UTF-16最少也会用2 Byte来表示一个字符,因此没有办法兼容ASCII编码(ASCII编码使用1 Byte来进行存储)。
3.Java中的码点与代码单元
码点:指的是CCS中的每个字符映射到的一个数字。
代码单元:CEF中比特组合的I基本单元。对于UTF-8来说,代码单元是8比特长;对于UTF-16来说,代码单元是16比特长。换一种说法就是UTF-8的是以一个字节为最小单位的,UTF-16是以两个字节为最小单位的。
对应关系:以utf-16为例,一个代码单元为2两字节,最多表示64k个字符,但是Unicode是包含了世界上所有语言的字符,远远大于64k个,这时候就出现了一个字符对应一个码点,而一个码点可能对应一个或两个(utf-16)代码单元的情况。
4.Java中的建议
建议统一使用码点,因为一个字符肯定是对应一个码点的,但可能对应两个代码单元。