是否需要wchar_t来支持unicode?

时间:2010-02-13 23:32:02

标签: c++ c unicode

unicode支持需要wchar_t类型吗?如果没有,那么这种多字节类型的重点是什么?当你使用char完成同样的事情时,为什么要使用wchar_t?

8 个答案:

答案 0 :(得分:33)

没有

从技术上讲,没有。 Unicode是定义代码点的标准,它不需要特定的编码。

因此,您可以使用带有UTF-8编码的unicode,然后所有内容都适合char个对象的一个​​或一个短序列,它甚至会被空终止。

UTF-8和UTF-16的问题是s[i]不一定是一个字符,它可能只是一个字符,而字符足够宽,你可以保留{{1}的抽象。 1}}是一个单个字符,因为它不会在各种变换下使字符串固定长度。

32位整数至少足以解决代码点问题,但它们仍然无法处理极端情况,例如,提升某些内容可能会改变字符数。

事实证明,s[i]问题即使是char32_t也没有完全解决,而其他编码也会导致文件格式不佳。

然后,你的暗示是非常有效的:x[i]是失败的,部分是因为Windows只有16位,部分是因为它没有解决所有问题,并且与字节流抽象非常不兼容

答案 1 :(得分:8)

你绝对不需要wchar_t来支持软件中的Unicode,事实上使用wchar_t会使它变得更难,因为你不知道“宽字符串”是UTF-16还是UTF-32 - 这取决于操作系统:在windows下utf-16所有其他的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。

答案 2 :(得分:6)

正如已经指出的那样,对于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支持 IF 标准足以保证wchar_t始终为16位宽。不幸的是它没有,所以你不得不从<cstdint>恢复到固定宽度的整数类型(例如std :: uint16_t)。

<slightly OffTopic Microsoft-specific rant>

由于Microsoft的Visual Studio UNICODE和MBCS(多字节字符集)构建配置引起的额外混乱,更令人愤怒的是什么。这两个都是

A)令人困惑和 B)彻头彻尾的谎言

因为&#34; UNICODE&#34; Visual Studio中的配置做任何事情来购买程序员实际的Unicode支持,这两种构建配置所暗示的差异也没有任何意义。为了解释,Microsoft建议使用TCHAR而不是直接使用char或wchar_t。在MBCS配置中,TCHAR扩展为char,这意味着您可以使用它来实现UTF-8支持。在UNICODE配置中,它扩展为wchar_t,在Visual Studio中恰好是16位宽并且可能用于实现UTF-16支持(据我所知,这是由本机编码使用的视窗)。但是,这些编码的两个都是多字节字符集,因为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>

答案 3 :(得分:5)

Unicode绝对不需要

wchar_t。例如,UTF-8保持与ASCII的向后兼容性并使用普通的8位charwchar_t主要支持所谓的多字节字符,或基本上任何使用sizeof(char)以上编码的字符集。

答案 4 :(得分:3)

不需要wchar_t。它甚至不能保证具有特定的编码。重点是提供一种数据类型,表示系统本机的宽字符,类似于表示本机字符的char。例如,在Windows上,您可以使用wchar_t访问宽字符Win32 API函数。

答案 5 :(得分:3)

小心,wchar_t通常是16位,这不足以存储所有unicode字符,并且在UTF_8中是一个糟糕的数据选择

答案 6 :(得分:2)

答案 7 :(得分:0)

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

wchar_t被添加到该语言中专门用于假设多字节字符。