是wchar_t
unicode支持所需的类型吗?如果没有,那么这种多字节类型的重点是什么?为什么你可以用wchar_t来完成同样的事情char
?
Dig*_*oss 33
从技术上讲,没有.Unicode是定义代码点的标准,它不需要特定的编码.
因此,你可以使用UTF-8编码的unicode,然后一切都适合一个或一个短的char
对象序列,它甚至仍然是空终止的.
UTF-8和UTF-16的问题在于它s[i]
不一定是一个字符,它可能只是一个字符,而对于足够宽的字符,你可以保留s[i]
单个字符的抽象,但它不会各种变换下的字符串固定长度.
32位整数至少足以解决代码点问题,但它们仍然不处理极端情况,例如,提升某些东西可以改变字符数.
事实证明,x[i]
即使是char32_t问题也没有完全解决,而其他编码也会导致文件格式不佳.
因此,你的隐含点是非常有效的:wchar_t
是失败的,部分是因为Windows只有16位,部分是因为它没有解决所有问题,并且与字节流抽象非常不兼容.
你绝对不需要wchar_t
在软件中支持Unicode,事实上使用wchar_t
它会使它变得更难,因为你不知道"宽字符串"是UTF-16还是UTF-32 - 它取决于操作系统:在windows下utf-16 all其他人utf-32.
但是,utf-8允许您轻松编写支持Unicode的软件(*)
请参阅:https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful
(*)注意:在Windows下你仍然必须使用,wchar_t
因为它不支持utf-8语言环境,因此对于启用了unicode的windows编程,你必须使用基于wchar的API.
正如已经指出的那样,对于unicode支持来说绝对不需要wchar_t.不仅如此,它也完全无用于此目的,因为标准没有为wchar_t提供固定大小的保证(换句话说,你不知道什么sizeof(wchar_t)将在特定系统上),而sizeof(char)将始终为1.
在UTF-8编码中,任何实际的UNICODE字符都映射到一个或多个(最多四个,我相信)八位字节的序列.在UTF-16编码中,任何实际的UNICODE字符都映射到一个或多个(最多两个,我相信)16位字的序列.在UTF-32编码中,任何实际的UNICODE字符都映射到一个32位字.
正如您所看到的,wchar_t可能对实现UTF-16支持有一定作用.如果标准足够好以保证wchar_t总是16位宽.不幸的是它没有,所以你必须从<cstdint>
(例如std :: uint16_t)恢复到固定宽度的整数类型.
<slightly OffTopic Microsoft-specific rant>
Run Code Online (Sandbox Code Playgroud)
更令人愤怒的是微软的Visual Studio UNICODE和MBCS(多字节字符集)构建配置引起的额外混乱.这两个都是
A)令人困惑和B)彻头彻尾的谎言
因为Visual Studio中的"UNICODE"配置都没有做任何事情来购买程序员实际的Unicode支持,这两种构建配置所暗示的差异也没有任何意义.为了解释,Microsoft建议使用TCHAR而不是直接使用char或wchar_t.在MBCS配置中,TCHAR扩展为char,这意味着您可以使用它来实现UTF-8支持.在UNICODE配置中,它扩展为wchar_t,在Visual Studio中恰好是16位宽,可能用于实现UTF-16支持(据我所知,这是Windows使用的本机编码) .但是,这两种编码都是多字节字符集,因为UTF-8和UTF-16都允许特定Unicode字符分别编码为多于一个char/wchar_t的可能性,因此术语多字节字符集(而不是单字节字符集?)没什么意义.
为了增加对伤害的侮辱,仅仅使用Unicode配置实际上并没有为您提供任何Unicode支持.要真正实现这一点,您必须使用像ICU(http://site.icu-project.org/)这样的实际Unicode库.简而言之,wchar_t类型和Microsoft的MBCS和UNICODE配置不会增加任何用途并导致不必要的混淆,如果它们都没有被发明,世界将是一个明显更好的地方.
</slightly OffTopic Microsoft-specific rant>
Run Code Online (Sandbox Code Playgroud)
wchar_t
绝对不是Unicode所必需的.例如,UTF-8保持与ASCII的向后兼容性并使用普通的8位char
.wchar_t
主要是支持所谓的多字节字符,或者基本上任何使用多个字符集编码的字符集sizeof(char)
.