16位宽字符有什么意义?

时间:2017-06-05 12:53:15

标签: unicode utf c11

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

我的问题是,在unicode的世界中,char16_t有多大用处?由UTF-16编码的字符可以是从2个字节到4个字节的任何位置,因此char16_t无法可靠地表示它,如果遵循规则,在宽字符中,字符总是需要相同的位宽度

据我所知,标准中的所有内容都不是"有用",而且C标准并没有规定编码,所以也许char16_t可供有人使用。但是,我是否正确,在处理Unicode方面,char16_t没有用处?

1 个答案:

答案 0 :(得分:1)

UTF-16是一种非常糟糕的编码,但我们并不知道首次设想Unicode时。那时,16位就足以存储任何指定的代码点,并且还没有发明具有许多理想属性的UTF-8。

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

当你需要与其中一个系统交谈时,一个明确代表16位代码单元而不是完整代码点的固定char16_t确实很有用。

  

一个char16_t无法可靠地表示它,如果遵循以下规则:在宽字符中,字符总是占用相同的位宽。

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