Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ unicode支持是否需要wchar\t?_C++_C_Unicode - Fatal编程技术网

C++ unicode支持是否需要wchar\t?

C++ unicode支持是否需要wchar\t?,c++,c,unicode,C++,C,Unicode,unicode支持是否需要wchar\u t类型?如果不是,那么这种多字节类型有什么意义?当您可以使用char完成相同的任务时,为什么要使用wchar\t?char通常是一个字节。(sizeof(char)必须等于1) wchar\u t被添加到语言中,专门用于假设多字节字符。wchar\u t不是必需的。它甚至不能保证有特定的编码。关键是提供一种表示系统本机宽字符的数据类型,类似于表示本机字符的字符。例如,在Windows上,您可以使用wchar\u t访问宽字符Win32 API函数。因为无

unicode支持是否需要
wchar\u t
类型?如果不是,那么这种多字节类型有什么意义?当您可以使用
char
完成相同的任务时,为什么要使用wchar\t?

char
通常是一个字节。(
sizeof(char)
必须等于1)


wchar\u t
被添加到语言中,专门用于假设多字节字符。

wchar\u t不是必需的。它甚至不能保证有特定的编码。关键是提供一种表示系统本机宽字符的数据类型,类似于表示本机字符的字符。例如,在Windows上,您可以使用wchar\u t访问宽字符Win32 API函数。

因为无法用
char
完成同样的任务:


Unicode绝对不需要wchar\u t。例如,UTF-8保持与ASCII的向后兼容性,并使用纯8位
char
wchar\u t
主要支持所谓的多字节字符,或者基本上支持使用大于
sizeof(char)
的字符集进行编码的任何字符集。请小心,wchar\u t通常是16位的,不足以存储所有unicode字符,例如,在UTF\u 8中,它是一个错误的数据选择。 从技术上讲,没有。Unicode是一种定义代码点的标准,它不需要特定的编码

因此,您可以将unicode与UTF-8编码结合使用,然后所有内容都可以放入一个或一个短序列的
char
对象中,甚至仍然以空结尾

UTF-8和UTF-16的问题是
s[i]
不一定是一个字符,它可能只是一个字符的一部分,而对于足够宽的字符,您可以保留
s[i]
是单个字符的抽象,尽管在各种转换下它不会使字符串固定长度

32位整数的宽度至少足以解决代码点问题,但它们仍然不能处理角点情况,例如,将某些内容上行链路可能会改变字符数

因此,事实证明,
x[i]
问题即使通过char32\t也无法完全解决,而其他编码也会造成糟糕的文件格式


因此,您的隐含观点是非常正确的:
wchar\u t
是一个失败,部分原因是Windows只提供了16位,部分原因是它没有解决所有问题,并且与字节流抽象非常不兼容。

您绝对不需要
wchar\u t
在软件中支持Unicode,事实上,使用
wchar\u t
会更加困难,因为您不知道“宽字符串”是UTF-16还是UTF-32——这取决于操作系统:在windows UTF-16下所有其他UTF-32

但是,utf-8允许您轻松编写支持Unicode的软件(*)

见:


(*)注意:在Windows下,您仍然必须使用
wchar\u t
,因为它不支持utf-8语言环境,所以对于启用unicode的Windows编程,您必须使用基于wchar的API。

正如已经注意到的,wchar\u t对于unicode支持是绝对不必要的。不仅如此,它也完全没有用,因为标准没有为wchar\u t提供固定大小的保证(换句话说,您无法提前知道特定系统上的sizeof(wchar\u t)是多少),而sizeof(char)始终是1

在UTF-8编码中,任何实际的UNICODE字符都映射到一个或多个(我相信最多四个)八位字节的序列。 在UTF-16编码中,任何实际的UNICODE字符都映射到一个或多个(我相信最多两个)16位字的序列。 在UTF-32编码中,任何实际的UNICODE字符都只映射到一个32位字

如您所见,如果标准足够好,可以保证wchar\u t始终为16位宽,那么wchar\u t在实现UTF-16支持方面可能会有一些用处。不幸的是,它没有,因此您必须从
(例如std::uint16\t)恢复为固定宽度的整数类型


更令人恼火的是微软的VisualStudioUnicode和MBCS(多字节字符集)构建配置造成的额外混乱。这两个都是

A) 混淆 B) 彻头彻尾的谎言

因为VisualStudio中的“UNICODE”配置既不能为程序员购买实际的UNICODE支持,这两种构建配置所隐含的差异也没有任何意义。为了说明这一点,微软建议使用TCHAR,而不是直接使用char或wchar。在MBCS配置中,TCHAR扩展为char,这意味着您可以使用它来实现UTF-8支持。在UNICODE配置中,它扩展到wchar_t,在Visual Studio中,wchar___t恰好是16位宽,并且可能用于实现UTF-16支持(据我所知,这是Windows使用的本机编码)。然而,这两种编码都是多字节字符集,因为UTF-8和UTF-16都允许将特定Unicode字符分别编码为多个字符/wchar______t,因此术语多字节字符集(相对于单字节字符集?)没有什么意义

雪上加霜的是,仅仅使用Unicode配置实际上并不能为您提供一点Unicode支持。要真正做到这一点,您必须使用像ICU()这样的实际Unicode库。简言之,wchar__t类型和微软的MBCS和UNICODE配置没有任何用处,也不会造成不必要的混乱,如果它们都没有被发明出来的话,世界将会变得更加美好

</slightly OffTopic Microsoft-specific rant>

正如那篇文章的标题所说,这是每个开发人员绝对、肯定必须了解的unicode。仅出于这个原因,我希望我能投更多的一票参考文献很好,但是
</slightly OffTopic Microsoft-specific rant>