我在http://www.joelonsoftware.com/articles/Unicode.html阅读有关 unicode 的信息。Joel 说 UCS-2 将所有 unicode 字符编码为 2 个字节,而 UTF-8 可能需要多达 6 个字节来编码一些 unicode 字符。您能否举个例子来解释一下,UCS-2 中如何对 6 字节 UTF-8 编码的 unicode 字符进行编码?
2 回答
UCS-2 是在 Unicode 的代码点少于 65536 个时创建的,因此它们都适合最多 2 个字节。一旦 Unicode 增长到超过 65536 个代码点,UCS-2 就过时了,取而代之的是UTF-16,它使用 2 个字节对所有与 UCS-2 兼容的代码点进行编码,其余的通过代理对使用 4 个字节。
UTF-8最初是为编码最多 6 个字节(最大 U+7FFFFFFF)的代码点而编写的,但后来被限制为 4 个字节(最大 U+1FFFFF,但禁止任何高于 U+10FFFF 的内容),因此它与 UTF 100% 兼容-16 来回,并且不编码 UTF-16 不支持的任何代码点。UTF-8 和 UTF-16 支持的最大代码点是 U+10FFFF。
因此,要回答您的问题,需要 5 或 6 字节 UTF-8 序列(U+200000 到 U+7FFFFFFF)的代码点不能用 UCS-2 甚至 UTF-16 编码。没有足够的可用位来保存如此大的代码点值。
UCS-2 将它可以存储的所有内容存储在两个字节中,并且对不适合该空间的代码点不做任何事情。这就是为什么 UCS-2 在今天几乎毫无用处的原因。
相反,我们有 UTF-16,它看起来像 UCS-2 的所有两字节序列,但也允许代理对,两字节序列对。使用这些,剩余的代码点可以使用总共 4 个字节进行编码。