Unicode 编码简介
Code Point
Unicode 为每个字符都分配了一个数字(Unsigned Integer),这个数字称之为 Code Point,中文可翻译为代码点,或者简称码点(以下使用 cp 指代 Code Point)。因此可以简单的认为 Unicode 其实就是规定了字符到数字的映射,字符映射到的数字即是 cp。
字符集
字符集就是 Charset(Character set的缩写),字符集定义了字符与 cp 之间的映射关系。
charset := mapping(character, cp)
这里可以看出 cp 并不是 Unicode 的专用名词,每个字符集都定义了自身包含的字符到 cp 的映射关系。
charset 示例:
Charset | cp | Character |
---|---|---|
ASCII | 0x35 | 5 (U+0035) |
ASCII | 0x41 | 5 (U+0041) |
ISO-8859-15 | 0xA4 | € (U+20AC) |
Unicode Character Set | 0x20AC | € (U+20AC) |
Unicode
Unicode 为世界上每种语言的每个字符都分配一个代码点,Unicode 6.0 包含了 1,114,112 个 cp,最后一个 cp 是 U+10FFFF。
Unicode 有版本概念,不同版本包含的 cp 个数是不同的。Unicode 1.0 包含 65535 个 cp,其中最后一个 cp 是 U+FFFF,[U+0000 - U+FFFF]又被称之为 BMP(Basic Multilingual Plane)。[U+10000 - U+10FFFF] 称之为 SMP(Supplementary Multilingual Plane)。
UCS
UCS 是 Unicode Character Set 的首字母缩写。包含了 1,114,112 个 cp。
UCS2
是 Unicode string 的一种具体的编码方式,将每个 cp 使用16 bit(2字节)来表示。因为长度限制,UCS2 只能编码 65535 个 Unicode cp,因此 UCS2 包含的字符被限制为 BMP。
UCS4
是 Unicode string 的一种具体的编码方式,将每个 cp 使用32 bit(4字节)来表示。UCS4 可以编码 Unicode 所有的 cp。
UTF16 & UTF32
UTF16 & UTF32 分别使用 16 位和 32 位的编码单元。对于 cp 大于 U+FFFF 的字符,UTF16 使用两个编码单元(又称之为 Surrogate pair)的方式编码。对于很大的 cp,理论上 UTF32 会使用多个编码单元,但实际情况是 Unicode 6.0 中所有的 cp,UTF32 都能使用一个编码单元编码。
Character String
Character string 又称之为 Unicode string,它的每一个 unit 都是一个 Unicode 字符。Character String 有三种实现:
- UCS2
- UCS4
- UTF-16
Byte String
Byte_string := encode(Character_string, encoding_method)
从上面的定义可以看出,Byte string 就是 Character string 的一种特定的编码方式。编码后的结果是一个 8bits 的一个字节数组。Byte string 是不包含编码方式的,因此如果使用了错误的解码方式解码 byte string 将会导致乱码。
UTF-8 String
确切的讲应该是 UTF-8 encoded string。这是一个 byte string。
编码和解码
编码确定了将 cp 转化为字节数组的方式,而解码则定了将字节数组转化为 cp 的方式。
code unit vs code point
温馨提示:反馈需要登录