【发布时间】:2011-01-16 14:28:02
【问题描述】:
Unicode 支持需要wchar_t 类型吗?如果不是,那么这种多字节类型的意义何在?当您可以使用 char 完成相同的事情时,为什么还要使用 wchar_t?
【问题讨论】:
Unicode 支持需要wchar_t 类型吗?如果不是,那么这种多字节类型的意义何在?当您可以使用 char 完成相同的事情时,为什么还要使用 wchar_t?
【问题讨论】:
char 通常是一个字节。 (sizeof(char) 必须等于 1)。
wchar_t 被添加到语言中,专门用于假设多字节字符。
【讨论】:
wchar_t 不是必需的。甚至不能保证有特定的编码。关键是要提供一种数据类型来表示系统原生的宽字符,类似于表示原生字符的 char。例如,在 Windows 上,您可以使用 wchar_t 访问宽字符 Win32 API 函数。
【讨论】:
【讨论】:
char 不仅是可能的,而且很可能是最常见的单一编码。
wchar_t 绝对不是 Unicode 所必需的。例如,UTF-8 保持与 ASCII 的向后兼容性并使用普通的 8 位 char。 wchar_t 主要支持所谓的多字节字符,或者基本上任何使用超过sizeof(char) 编码的字符集。
【讨论】:
wchar_t 主要支持所谓的多字节字符" - 您将 "multi-byte" 与 “可变宽度”。 “可变宽度” 是 UTF-8 和 UTF-16 的固有特性。那里没有区别。此外,C++ 标准不要求对wchar_t 进行任何特定编码。编译器可以选择将其设为 UTF-32,从而产生 固定 宽度的字符编码。这个答案相当具有误导性,完全没有用。 -1.
请注意,wchar_t 通常为 16 位,不足以存储所有 unicode 字符,并且是 UTF_8 中数据的错误选择
【讨论】:
wchar_t“不足以存储所有Unicode字符”的重点是该程序没有可移植获得固定宽度的简单性用它编码。
从技术上讲,没有。 Unicode 是一种定义代码点的标准,它不需要特定的编码。
因此,您可以将 unicode 与 UTF-8 编码一起使用,然后所有内容都可以放入一个或一个短序列 char 对象中,它甚至仍会以空值结尾。
UTF-8 和 UTF-16 的问题在于 s[i] 不再是一个字符,它可能只是一个字符,而对于足够宽的字符,您可以保留 s[i] 的抽象概念单个字符,但它不会在各种转换下使 strings 固定长度。
32 位整数的宽度至少足以解决代码点问题,但它们仍然不能处理极端情况,例如,向上转换可以改变字符数。
所以事实证明x[i] 问题即使是char32_t 也没有完全解决,而且那些其他编码会导致文件格式很差。
那么,您的暗示是非常有效的:wchar_t 是失败的,部分原因是 Windows 仅将其设为 16 位,部分原因是它没有解决所有问题,并且与字节流抽象非常不兼容。
【讨论】:
wchar_t,或使用 32 位 wchar_t。使用 UTF-16 在技术上是不符合标准的,因为没有“null-null-terminated multi-wchar_t”编码这样的东西。
您绝对不需要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 绝对不是必需的。不仅如此,它也完全没有用,因为该标准没有为 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>
更令人气愤的是微软的 Visual Studio UNICODE 和 MBCS(多字节字符集)构建配置造成的额外混乱。这两个都是
A) 令人困惑和 B) 一个彻头彻尾的谎言
因为 Visual Studio 中的“UNICODE”配置并没有为程序员购买实际的 Unicode 支持做任何事情,这两种构建配置所暗示的差异也没有任何意义。为了解释,微软建议使用 TCHAR 而不是直接使用 char 或 wchar_t。在 MBCS 配置中,TCHAR 扩展为 char,这意味着您可以使用它来实现 UTF-8 支持。在 UNICODE 配置中,它扩展为 wchar_t,它在 Visual Studio 中恰好是 16 位宽,并且可能用于实现 UTF-16 支持(据我所知,这是 Windows 使用的本机编码) .但是,两种这些编码都是多字节字符集,因为 UTF-8 和 UTF-16 都允许将特定 Unicode 字符分别编码为多个字符/wchar_t ,所以术语多字节字符集(相对于单字节字符集?)意义不大。
雪上加霜,仅仅使用 Unicode 配置实际上并不能为您提供一点 Unicode 支持。要真正做到这一点,您必须使用真正的 Unicode 库,例如 ICU (http://site.icu-project.org/)。简而言之,wchar_t 类型以及 Microsoft 的 MBCS 和 UNICODE 配置并没有增加任何用处并造成不必要的混乱,如果它们都没有被发明出来,世界将会变得更加美好。
</slightly OffTopic Microsoft-specific rant>
【讨论】: