Unicode 16位宽的字符有什么意义?

Unicode 16位宽的字符有什么意义?,unicode,utf,c11,Unicode,Utf,C11,我正在读《简而言之C》这本书。它比较了两种表示非拉丁字符的方法:宽字符和多字节字符。它说宽字符对字符集中的每个字符使用相同的位宽度(强调我的字符)。然后,介绍了类型wchar\u t,以及在C11标准之后的类型char16\u t和char32\u t 我的问题是,在unicode的世界里,char16\t有多有用?UTF-16编码的字符可以是2个字节到4个字节之间的任意位置,因此如果遵循在宽字符中字符总是采用相同的位宽度的规则,则char16\u t无法可靠地表示它 我知道标准中并非所有的东西

我正在读《简而言之C》这本书。它比较了两种表示非拉丁字符的方法:宽字符和多字节字符。它说宽字符对字符集中的每个字符使用相同的位宽度(强调我的字符)。然后,介绍了类型
wchar\u t
,以及在C11标准之后的类型
char16\u t
char32\u t

我的问题是,在unicode的世界里,
char16\t
有多有用?UTF-16编码的字符可以是2个字节到4个字节之间的任意位置,因此如果遵循在宽字符中字符总是采用相同的位宽度的规则,则
char16\u t
无法可靠地表示它


我知道标准中并非所有的东西都是“有用的”,而C标准并不规定编码,因此可能
char16\u t
只是供某人使用。但是,我是否正确,在处理Unicode方面,
char16\u t
没有那么有用?
UTF-16是一种非常糟糕的编码,但我们不知道Unicode最初是在什么时候出现的。当时,16位足以存储任何指定的代码点,而具有许多理想特性的UTF-8尚未发明

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

当您需要与其中一个系统对话时,一个固定的
char16\t
确实很有用,它明确表示16位代码单元,而不是完整的代码点

如果一个字符遵循的规则是,在宽字符中,一个字符总是采用相同的位宽度,那么字符16_t就不能可靠地表示它


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

嗯,这比UTF16使用uint8_t要简单一些。。。但是,如果要存储完整的代码点,char16\t是没有用的。。。(同样,存储完整代码点的功能对于正确处理Unicode也不够有用。(标准化……您有更多的问题)这些只是帮助存储代码点的编码元素的基本类型
char16\u t
对于utf-16很有用,您需要一个或两个。与
unsigned char
一样,要存储utf-8的编码元素,需要1到4个元素。请注意,关于编码大小的推理是危险的,一个印刷字体可能需要多个代码点。谷歌“zalgo”提供了一个过多的例子。问题是你不能保证拥有
stdint.h
,所以你需要一个内置类型,保证可以用于UTF-16。因为现在Unicode是标准,二进制表示主要是UTF-8,
string
是比
char
更有用的抽象leel<代码>ĉ可以是一个Unicode代码点,也可以是两个(
c
加零宽度)
^
)-需要进行文本规范化。我会选择一个Unicode内部
字符串
,就像在java中一样,这里有一个
getBytes
和一个带有字节和字符集的构造函数。