Unicode 是用于计算机处理的文本的表示的通用字符集编码标准。通过给每个字符一个编号,程序员可以创造不同的字符编码集,让计算机在同一个文件或程序中存储、处理和传输任何语言组合。如果没有正确标明数据的字符集,其它程序和计算机就会错误地显示该文本(乱码),或者在处理过程中损坏文本。Unicode 只规定了每个字符的编号,编号是十进制的,UTF-32、UTF-8、UTF-16(Unicode Transformation Formats) 则给出了如何存储这些编号,存储形式则是二进制,也就是说 Unicode 是字符集,UTF-x 是字符集编码。
字符编码过程:Grapheme → Code Point Code Unit
- Grapheme,字位/字素,人类写作系统的简单单元、书写单位
- Code Point,码位/码点,码位是一个数值,Grapheme 图形映射到一个或多个码位
- Code Unit,码元,二进制编码
ASCII,西文字符编码,只有一种编码策略,将字符映射到 1 字节。ASCII 中 1 字位就是 1 字节,而 Unicode中,1 字位可能对应多个码位,1 个码位可能对应多个字节。
Unicode 的编码策略:
- UTF-32,定长字符编码,将每个码位转为 4 字节的码元,造成空间浪费。
- UTF-8,可变长度字符编码,将每个码位映射到 1~4 字节之间,码位尺寸与码元字节不等,这样使得索引定位它们更加困难,也对性能有些影响。可以向后兼容 ASCII 编码。
- UTF-16,变长字符编码,每个码位被编码为 1~2 个 16 bit 的码元。在 Unicode 基本多文种平面定义的字符(无论是拉丁字母、汉字或其他文字或符号),一律使用 2 字节储存。而在辅助平面定义的字符,会以代理对(surrogate pair)的形式,以两个 2 字节的值来储存。UTF-16比起 UTF-8,好处在于大部分字符都以固定长度的字节(2 字节)储存,但UTF-16却无法兼容于 ASCII 编码。
不同的编码策略可能将同一码位编码成不同的码元。