Unicode 编码简介

Last Modified: 2023/08/11

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

有问题吗?点此反馈!

温馨提示:反馈需要登录