【问题标题】:What is the largest code point for 16-bit wchar_t type?16 位 wchar_t 类型的最大代码点是多少?
【发布时间】:2017-04-06 22:25:55
【问题描述】:

据说hereUTF-16的最大码位是10FFFF

也写在那个页面上

BMP 字符需要一个 16 位代码单元来处理或存储。

但在位表示中10FFFF

0001 0000   1111 1111   1111 1111

我们看到它占用了16位wchar_t的15位以上 (允许实现仅支持具有 >=0 值的宽字符,与 wchar_t 的符号无关)

对于 16 位 wchar_t真正最大的代码点是多少?

【问题讨论】:

  • 你了解“代码点”和“代码单元”的区别吗?或者知道 UTF-16 是如何工作的?
  • @dan04 "code point" 是数字,指定给每个字母。我不知道 UTF-16 是如何工作的。我标记它是因为据说 16 位 wchar_t 使用 UTF-16。而且我不知道什么是“代码单元”。
  • @dan04 你知道代码点的哪个最大值可以存储在一个 16 位 wchar_t 类型的单个变量中吗?
  • UTF-16 代码单元是 16 位,因此它是 UTF-16。但是最大的码点 10FFFF 需要 2 个单位(2 wchar_t),所以称为代理对。单个 wchar_t(假设为 16 位)只能编码整个 21^2 空间的大约 63K 个字符。
  • @Flanker 请将可以存储在 16 位 wchar_t 单个变量中的最大代码点值放在答案中,以便我投票

标签: c utf-16 wchar-t widechar


【解决方案1】:

这里说UTF-16的最大码位是10FFFF

是的,但是您误解了从中绘制该表格的表格。

U+10FFFF 是最大的 Unicode code point 值。 UTF-16 本身不是 Unicode,它是使用 16 位代码单元 对 Unicode 代码点进行编码(就像 UTF-8 是一种编码 em> 使用 8 位代码单元)。正如您所说,16 位不足以表示 Unicode 代码点值的全部范围。 Unicode 码点 U+0000 - U+FFFF 的 UTF-16 编码只需要 1 个码位,而码点 U+10000 - U+10FFFF 的编码则需要 2 个码位共同作用,称为“代理对”。 UTF-16 是 UCS-2 的继承者,UCS-2 是 Unicode 的原始 16 位编码,但它只能编码代码点 U+0000 - U+FFFF。 UTF-16 向后兼容 UCS-2,但添加代理项对允许 UTF-16 支持全部范围的 Unicode 代码点。

UTF-16 的设计目的是为该目的保留可以形成代理对的代码单元值。它们不能被误解为常规字符,即使它们看起来不成对(因此必须是无效的代码序列)。

另请注意,尽管很常见,但 C 实现将 UTF-16(或 UTF-8)称为“字符集”有点滥用,因为它们的代码单元并不都对应 1-1带有 Unicode 字符。或者,至少它们对应的字符必须被解释为它们是的代码单元。这是解决有效表示大范围字符问题的实用方法。

也写在那个页面上

BMP 字符需要一个 16 位代码单元来处理或存储。

这也是事实。您显然忽略了 BMP(基本多语言平面,代码点 U+0000 - U+FFFF)字符是所有 Unicode 字符的子集这一事实。实际上,它们的 1/17 或更少,这取决于您如何计算。它们的代码点值都可以用 16 位表示(即在一个 UTF-16 代码单元中)这一事实实际上可以被视为该子集的定义。

我们看到它占用了超过 15 位的 16 位 wchar_t(一个 允许实现支持具有 >=0 值的宽字符 仅,与 wchar_t 的符号无关)

不,正如我们在对one of your other recent questions 的回答中所述。该标准对 C 实现没有任何限制,只支持非负代码点值。这只是所有当前广泛使用的编码字符集的代码点分配的de facto 状态。在其上签名 wchar_t 的符合 C 实现可以提供一个字符集,其中一些扩展字符具有对应的负 wchar_t 值。

16 位 wchar_t 的真正最大代码点是多少?

这与上述任何内容都无关。事实上,它没有多大意义。代码点值是(编码的)字符集的特征,而不是任何 C 数据类型的特征。它们是与该集合支持的字符相对应的数字。

如果 C 实现声称提供 UTF-16 作为支持的字符集,那么它的 wchar_t 必须至少有 16 个值位,因为该类型必须能够表示所有 UTF-16 代码单元值.如果该类型总共只有 16 位,那么它们都必须是值位,这使得该类型必须是无符号的,并且能够支持高达 0xFFFF 的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2010-09-24
    • 2019-06-16
    相关资源
    最近更新 更多