16 位 wchar_t 类型的最大代码点是多少?

What is the largest code point for 16-bit wchar_t type?

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

那个页面上也写着

BMP characters require one 16-bit code unit to process or store.

但是在位表示中10FFFF

0001 0000   1111 1111   1111 1111

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

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

It is said here that UTF-16's largest code point is 10FFFF

是的,但是您误解了您从中提取的 table。

U+10FFFF 是最大的 Unicode code point 值。 UTF-16 本身不是 Unicode,它是使用 16 位代码单元 的 Unicode 代码点的 编码(正如 UTF-8 是一个编码 使用 8 位代码单元)。正如您所说,16 位不足以表示整个 Unicode 代码点值范围。 UTF-16 编码的 Unicode 码点 U+0000 - U+FFFF 只需要 1 个编码单元,但是码点 U+10000 - U+10FFFF 的编码需要 2 个编码单元一起作用,称为 "surrogate pair" . UTF-16 是 UCS-2 的后继者,它是 Unicode 的原始 16 位编码,但它只能编码代码点 U+0000 - U+FFFF。 UTF-16 向后兼容 UCS-2,但添加代理对允许 UTF-16 支持所有 Unicode 代码点。

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

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

Also it is written on that page that

BMP characters require one 16-bit code unit to process or store.

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

We see that it occupies more than 15 bits of 16-bit wchar_t (an implementation is allowed to support wide characters with >=0 value only, independently of signedness of wchar_t)

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

What is the real largest code point for 16-bit wchar_t?

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

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

的值