【问题标题】:How does UCS-2 display unicode code points that take 6 bytes in UTF-8?UCS-2 如何在 UTF-8 中显示占用 6 个字节的 unicode 代码点?
【发布时间】:2013-12-11 17:49:29
【问题描述】:

我在http://www.joelonsoftware.com/articles/Unicode.html 阅读有关 unicode 的信息。 Joel 说 UCS-2 将所有 unicode 字符编码为 2 个字节,而 UTF-8 可能需要多达 6 个字节来编码一些 unicode 字符。请您举例说明,UCS-2 中如何对 6 字节 UTF-8 编码的 unicode 字符进行编码?

【问题讨论】:

  • 当然,没有编码“显示”任何东西; encodings 编码,要实际显示任何内容,您必须对编码进行解码。

标签: unicode utf-8 ucs2


【解决方案1】:

UCS-2 将 它可以存储的所有内容 存储在两个字节中,并且对不适合该空间的代码点不做任何事情。这就是为什么 UCS-2 在今天几乎毫无用处的原因。

相反,我们有 UTF-16,对于所有两字节序列,它看起来像 UCS-2,但也允许 代理对pairs 两字节序列。使用这些,剩余的代码点可以使用总共 4 个字节进行编码。

【讨论】:

  • 虽然这不是原始问题的一部分,但请您解释一下代理对是如何工作的?任何对代理对在线资源的参考也很好。
  • UTF-8UTF-16
【解决方案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 的内容),因此它是 100%与 UTF-16 来回兼容,并且不编码 UTF-16 不支持的任何代码点。 UTF-8 和 UTF-16 支持的最大代码点是 U+10FFFF。

因此,为了回答您的问题,需要 5 或 6 字节 UTF-8 序列(U+200000 到 U+7FFFFFFF)的代码点不能在 UCS-2 中编码,或者甚至是 UTF-16。没有足够的可用位来保存如此大的代码点值。

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 1970-01-01
    • 2010-12-24
    • 2014-09-14
    • 2016-05-20
    • 2015-05-30
    • 2011-03-14
    相关资源
    最近更新 更多