unicode和utf8
很多人,即使是有一些项目经验的人,都说过这句话。但是如果深入的理解什么是unicode之后就会知道,原来我们经常说的这句话“unicode字符是2个字节”这句话是有问题的。
要说清楚这个问题,首先就要说清楚unicode到底是什么。
unicode是一个标准,也可以说是世界上的语言字符和数字映射的一种标准。它没有限制字符的数量,但是可能这个标准规定的映射只是映射了一部分字符。每个字符映射一个code point(码点)。Unicode 目前规划的总空间是17个平面(平面0至16),0x0000 至 0x10FFFF。每个平面有 65536 个码点。
所以Unicode支持的字符上限是65536个 这句话也是有问题的,这65536个字符是我们最常用的基本字符,但是还有很多字符是在0x0000--0xFFFF之外的。在我们说unicode是几个字节这句话的时候,就已经暗示了我们现在讨论的是unicode在计算机内存里的存储方式了(只有在计算机系统里才有字节这种定义,如果脱离计算机的话unicode是不会与字节扯上关系的)。unicode存储在计算机内存里肯定是需要编码的,那么就有UTF-8,UTF-16,UTF-32等编码方案。为什么我们常说“unicode字符是2个字节”,是因为windows默认的unicode编码就是UTF-16。而unicode在这种编码下,大部分都是2个字节的,至少上面提到的前65536个基本常用字符都是2个字节的。所以就有了“unicode字符是2个字节”这句话。其实UTF-16是一种变长的编码方案,有些unicode字符的抽象码点(code point)编码后是2个字节,有些是4个字节。所以“unicode字符是2个字节”这句话大多数时候是正确的,但是unicode字符的抽象码点(code point)超过范围0x0000--0xFFFF后就不对了。
- 所谓的「ANSI」指的是对应当前系统 locale 的遗留(legacy)编码。
- 所谓的「Unicode」指的是带有 BOM 的小端序 UTF-16。
- 所谓的「UTF-8」指的是带 BOM 的 UTF-8。