【问题标题】:Confusion over UTF-16 and UTF-32对 UTF-16 和 UTF-32 的混淆
【发布时间】:2014-05-29 13:21:17
【问题描述】:

据我了解,UTF-16 和 UTF-32 之间的主要区别在于 UTF-32 始终是每个字符四个字节,而 UTF-16 有时是一个字节,有时是每个字符两个字节。这使 UTF-16 具有比 UTF-32 占用更少内存的优势,但 UTF-32 具有对第 n 个字符进行恒定时间访问的优势。

我的问题是,如果您可以像在 UTF-16 中那样用最多两个字节来表示每个 unicode 字符,那么为什么没有一种总是使用两个字节来编码每个字符的格式呢?这种格式虽然比 UTF-16 内存稍贵一些,但在使用一半内存的情况下允许恒定时间访问,因此绝对优于 UTF-32。

我的误解是什么?

【问题讨论】:

  • UTF-16 代码单元为 16 位宽(2 个八位字节(大多数现代硬件上的字节))。整个代码点使用一个或两个 16 位代码单元,因此最多使用 32 位,如 UTF-32。如果您想要更节省空间、更容易处理且与字节顺序无关的编码,请查看 UTF-8。
  • 看看标签维基。它们信息量很大。
  • 在此处了解更多信息:utf8everywhere.org

标签: memory unicode encoding utf


【解决方案1】:

你说错了:

  1. Unicode 定义最大为 0x110000 的值(代码点),即 221。一旦达到 0x10FFFF,就需要新的编码方案,但有大量未使用的代码点,因此 Unicode 在达到该限制之前在可预见的未来有足够的扩展空间。

  2. UTF-32 使用 32 位代码单元。由于当前定义的每个代码点都小于 0x10FFFF,因此每个代码点都适合 1 个代码单元。

  3. UTF-16 使用 16 位代码单元。它的编码方案对 0x10000 以下的代码点使用 1 个代码单元,对剩余的代码点使用两个代码单元(称为代理对)。 UTF-16 设计用于编码最大为 0x10FFFF 的代码点。

  4. UTF-8 使用 8 位代码单元。它的编码方案使用 1-4 个代码单元来表示一个代码点,具体取决于它的值。最初的编码方案用于允许最多 6 个代码单元用于最多 0x7FFFFFFF 的代码点,但后来被限制为 4 个代码单元,因此 0x10FFFF 以上的代码点在 UTF-16 中无法表示,在 UTF-8 中是非法的允许在 UTF-8 和 UTF-16 之间进行无损转换。

【讨论】:

    【解决方案2】:

    UTF-16 对平面 0、基本多语言平面 (BMP)、U+0000...U+FFFF 中的字符使用两个字节,对任何其他字符使用四个字节。不能用两个字节表示所有 Unicode 字符。

    【讨论】:

    • 取决于字节 == 八位字节。
    • @Deduplicator:这是一个安全的假设,考虑到如今广大大多数计算机使用 8 位字节,而例外情况往往是数字信号处理器之类的'不关心表示 Unicode 文本。不过,如果您确实有一个字节大于 8 位的系统,您可以在 UTF-9 or UTF-18 中编码文本。
    【解决方案3】:

    为什么没有一种格式总是使用两个字节来编码每个字符?

    有;它叫做UCS-2。

    问题是,直接的 16 位格式只允许您表示 216 = 65 536 个代码点。这对于 Unicode 1.0(其目标是“包含世界上所有现存语言的字符”)来说已经足够了,但随后项目的范围扩大到包括埃及象形文字等历史文字,并且 16 位的限制变得过于有限。

    因此,Unicode Consortium 决定添加 16 个补充平面,以容纳一百万个新字符,将代码空间的上限从 U+FFFF 扩大到 U+10FFFF。同时,发明了 UTF-16 的“代理对”机制,以便已经围绕 UCS-2 构建的平台(特别是 Windows NT 和 Java 编程语言)可以表示额外的代码点。

    【讨论】:

    • 扩展@Deduplicator 的评论,当前版本的Unicode 中有>74K CJKV 字符,因此至少其中一些字符必须由两个以上的8 位字节表示。
    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 2011-02-10
    • 2014-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2012-07-23
    • 2014-11-14
    相关资源
    最近更新 更多