16 位宽字符有什么意义?

What is the point of a 16-bit wide character?

我正在看书"C in a Nutshell"。它比较了表示非拉丁字符的两种方式:宽字符与多字节字符。它说宽字符对字符集中的每个字符使用相同的位宽(强调我的)。然后,它引入了类型 wchar_t,并且在 C11 标准之后,类型 char16_tchar32_t.

我的问题是,在 unicode 的世界里,char16_t 能有多大用处?由 UTF-16 编码的字符可以是 2 个字节到 4 个字节之间的任何位置,因此 char16_t 不能可靠地表示它,如果遵循这样的规则,在宽字符中,字符总是 the相同的位宽

我知道并非标准中的所有内容都可能是 "useful",并且 C 标准没有规定编码,所以也许 char16_t 只是供某些人使用。但是,我是否更正了,就处理 Unicode 而言,char16_t 没那么有用?

UTF-16 是一种非常糟糕的编码,但我们在最初设想 Unicode 时并不知道这一点。那时,16 位足以存储任何分配的代码点,并且尚未发明具有许多理想属性的 UTF-8。

因此,从那时开始构建的系统从头开始支持 Unicode——例如 Windows NT 和 Java——它们的字符串存储类型基于 UTF-16。这些系统以及与它们互操作的其他系统要求您使用具有 16 位代码单元语义的字符串来访问它们的 API。

当您需要与其中一个系统通信时,固定的 char16_t 绝对代表 16 位代码单元,而不是完整的代码点,确实很有用。

a char16_t cannot reliably represent it, if one follows the rule that, in wide characters, a character always takes the same bit width.

这不是真正的规则。 char16_t(在相同类型的平台上同样 wchar_t)当然可以(并且通常)用于存储 UTF-16 代码单元,星界字符由两个(代理)代码表示单位。