是否需要wchar_t来支持unicode?

zer*_*lus 29 c c++ unicode

wchar_tunicode支持所需的类型吗?如果没有,那么这种多字节类型的重点是什么?为什么你可以用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位,部分是因为它没有解决所有问题,并且与字节流抽象非常不兼容.

  • BMP之外的字符最初是在2001年的Unicode 3.1中分配的. (6认同)
  • "UTF-8的问题在于......"IMO根本不是问题.另一方面,wchar_t的问题在于它给出了错误的错觉,即当一个wchar_t-equals-one-UNICODE字符抽象显然不是这样时,它仍然成立.这只是促进了错误的代码,它打破了程序必须处理违反这种错误假设的角色的那一刻. (2认同)
  • 您所说的“UTF-8 问题”与 UTF-16 问题完全相同。您的回答给人的印象是 wchar 在某些系统中是 16 位的,在这方面问题较少。不存在可以“大部分保留”抽象的中间立场——您要么正确处理 UTF-16 代理项对,要么不处理,在这种情况下您的程序就会被破坏。 (2认同)

Art*_*yom 8

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


ant*_*red 7

正如已经指出的那样,对于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)


Zol*_*oli 5

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

  • 听起来你暗示UTF-8将所有字符编码为8位,这不仅是不真实的,而且如果是真的则是数据压缩的壮举.UTF-8*是一个多字节编码:一些字符使用8位编码,一些使用16位编码,一些使用24位,一些使用32位.它可以支持(尽管目前不需要,我认为)使用高达48位编码的字符. (4认同)
  • "听起来你暗示UTF-8将所有字符编码为8位" - 不,它没有. (3认同)