16 位宽字符有什么意义?
What is the point of a 16-bit wide character?
我正在看书"C in a Nutshell"。它比较了表示非拉丁字符的两种方式:宽字符与多字节字符。它说宽字符对字符集中的每个字符使用相同的位宽(强调我的)。然后,它引入了类型 wchar_t
,并且在 C11 标准之后,类型 char16_t
和 char32_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 代码单元,星界字符由两个(代理)代码表示单位。
我正在看书"C in a Nutshell"。它比较了表示非拉丁字符的两种方式:宽字符与多字节字符。它说宽字符对字符集中的每个字符使用相同的位宽(强调我的)。然后,它引入了类型 wchar_t
,并且在 C11 标准之后,类型 char16_t
和 char32_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 代码单元,星界字符由两个(代理)代码表示单位。