对于 JavaScript 使用的是 UCS-2 还是 UTF-16 这个问题,我找了很久,没有发现一个权威的回答,我决定自己研究一下它。这个回答来自于你对 JavaScript 引擎或者对 JavaScript 语言的理解。

一、著名的 BMP (Basic Multilingual Plane)

Unicode 标识符通过一个明确的名字和一个整数来作为它的码位(code point).比如,“©️” 字符的码位可以用“版权标志”和U+00A9(0xA9,也可以写作十进制 169)来表示。

Unicode 字符分为 17 组平面,每个平面拥有 2^16 (65,536)个码位.有一些码位没有分配字符,也有一些码位被保留,成为私有的,也有一些码位是永远被保留的,作为无字符的标志。每一个码位都可以用 16 进制 xy0000xyFFFF 来表示,这里的 xy 是表示一个 16 进制的值,从 0010

这第一个位置(当 xy00 的时候)被称为 BMP (基本多文种平面, Basic Multilingual Plane)。它包含了最常用的码位从 U+0000 到 U+FFFF。

这里需要补充一点额外的平面知识,以及术语的表格。

平面始末字符值中文名称英文名称
0号平面U+0000 - U+FFFF基本多文种平面BMP
1号平面U+10000 - U+1FFFF多文种补充平面SMP
2号平面U+20000 - U+2FFFF表意文字补充平面SIP
3号平面U+30000 - U+3FFFF表意文字第三平面TIP
4~13号平面U+40000 - U+DFFFF(尚未使用)
14号平面U+E0000 - U+EFFFF特别用途补充平面SSP
15号平面U+F0000 - U+FFFFF保留作为私人使用区(A区)PUA-A
16号平面U+100000 - U+10FFFF保留作为私人使用区(B区)PUA-B

引用自:wikipedia

其余 16号平面(U+100000 到 U+10FFFF)称为补充的平面。这里我将不讨论它;只需要记住两个概念:BMP 字符和非 BMP 字符,后者也被称为补充字符。

二、UCS-2 和 UTF-16 之间的不同

UCS-2 和 UTF-16 都是 Unicode 的字符编码方式。

UCS-2(2个字节的通用字符集)是一种固定长度的编码格式,只需要使用编码为 16 字节编码单元来表示码位。这样的表示结果将和 UTF-16 在 00xFFFF (BMP)范围内大多数的结果一样。

UTF-16(16 位 Unicode 转换格式)是对 UCS-2 的一个扩展,它允许表示比 BMP 范围内更多的字符。它是一种可变长度格式,它的每个码位能够使用 1 个或者 2 个 16 位长的码元来表示。这种方式能够编码的码位在 00x10FFFF 之间。

比如,在 UCS-2 和 UTF-16 中,对于 BMP 字符 U+00A9 版权标志(©️)都能被编码为:0x00A9

这里补充一下 UCS-2、UCS-4、BMP

CPU 处理多字节数的方式分为:“大尾”(big endian)和“小尾”(little endian),简单的理解就是一个 Unicode 编码,比如 6C49,写到文件里面 6C 49 或者 49 6C,两种方式,前者就叫“大尾”,后者就叫“小尾”。
UCS 可以分为两种格式:UCS-2 和 UCS-4。UCS-2 使用两个字节编码,UCS-4 使用4个字节(实际只有 31 位,最高位必须是 0)编码。
转换关系:UCS-4 中高两个字节为 0 的码位称为 BMP;UCS-4 的 BMP 去掉前面两个零字节就得到 UCS-2;UCS-2 加上两个零字节就得到 UCS-4 中的 BMP。

三、代理对(Surrogate pairs)

对于 BMP 之外的字符,比如 U+1D306 四条线居中(其实不好翻译:tetragram for centre,

标签: javascript

添加新评论