是否需要wchar_t来支持unicode?

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

没有。

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

因此,你可以使用带有UTF-8编码的unicode然后一切都适合一个或一个短的char对象序列,它甚至仍然是空终止的。

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

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

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

因此,你的隐含点是非常有效的: wchar_t是一个失败,部分是因为Windows只使它16位,部分是因为它没有解决所有问题,并且与字节流抽象非常不兼容。

你绝对不需要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。

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

如前所述,对于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位宽。 不幸的是它没有,所以无论如何你必须从 (例如std :: uint16_t)恢复为固定宽度的整数类型。

  

更令人愤怒的是微软的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配置不会增加任何用途并导致不必要的混淆,如果它们都没有被发明,世界将是一个明显更好的地方。

  

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

因为你不能char完成同样的事情:

绝对最低每个软件开发人员绝对必须知道Unicode和字符集(没有借口!)

小心,wchar_t通常是16位,这不足以存储所有unicode字符,并且例如UTF_8中的数据选择不好

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

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