Unicode(字符集)
广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……
Unicode产生原因
-
在Unicode出现之前,各国拥有自己的不同编码标准,如美国的ASCII西欧的ISO8859-1,俄罗斯的koi-8,中国的GB18030和BIG-5
- 对于任意给定的代码,在不同的编码方案下,有可能对应不同的字母 采用大字符集的语言,其编码长度有可能不同
- 如有些字符才用单字节,有些使用两个或多个字节
Unicode设计目的正式为了解决这一问题,Unicode在设计之初被定义为两个字节,即65535个代码值
由于加入了诸多汉语,日语,韩语的表意字符,Unicode字符如今已经超过了65535个,16位的char类型已经不能满足表述所有的Unicode字符了
Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)
字符集
字符集为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
码点(code point)
码点是指一个编码表中的某个字符对应的代码值
-
在Unicode标准中码点才用16进制表示,并加上前缀U+
- 如U+0041就是表示拉丁字母A的码点
Unicode的码点可以分成17个代码平面(code plane)
代码平面(code plane)
Unicode的码点可以分成17个代码平面(code plane)
第一个代码平面称为基本多语言平面(basic multilingual plane),包括码点从U+0000到U+ffff的经典Unicode代码
其余16个平面为从U+10000到U+10ffff的辅助字符(supplementy character)
UTF-16(编码规则)
编码规则
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
UTF-8是采用16位为一个**代码单元(code unit)**的可变长编码规则
代码单元
在UTF-16中,用16位表示基本多语言平面中的字符,而表示基本多语言平面的空间长度成为一个代码单元
UTF-16使用16位的代码单元表示基本多语言平面字符,而辅助字符则使用一对连续的代码单元表示
辅助字符的代码单元使用基本多语言平面中未使用的2048个编码值为范围,称为替代区域(surrogate area),其中U+D800~U+DBFF用于识别第一个代码单元,U+DC00~U+DFFF用于识别第二个代码单元
这样做可以快速识别代码单元究竟是一个代码单元的基本多语言平面中的Unicode经典代码的字符编码,还是两个代码单元的辅助字符第一或第二部分
如θ是八元数集的一个数学符号,码点为U+1D546,超出了Unicode的基本多语言平面,属于辅助字符,UTF-16中使用两个代码单元存储即U+D835和U+DD46