c++ - 什么是执行宽字符集及其编码?

标签 c++ c character-encoding language-lawyer

标准中提到了很多与字符集相关的概念:基本源字符集、基本执行字符集、基本执行宽字符集、执行字符集、执行宽字符集:

  • 基本源字符集:91个图形字符,加上空格字符、HT、VT、FF、LF(只是借用了ASCII的名称缩写)。
  • 基本执行(宽)字符集:基本源字符集的所有成员,加上 BEL、BS、CR、(宽)NUL。
  • 执行字符集和执行宽字符集分别是基本执行字符集和基本执行宽字符集的实现定义超集。执行字符集成员的值和附加成员集是特定于语言环境的。

我对基本源字符集、基本执行字符集和基本执行宽字符集没有太多疑问。

至于执行字符集,标准说它是实现定义的和特定于语言环境的,所以我试图通过观察字符串文字初始化的 char 数组的字节内容来获得一些真正的意义,该数组的值应等于数字执行字符集中字符的编码值(由于多字节编码,通用字符名称可能映射到多个 char 元素):

char str[] = "Greek lowercase alpha is: \u03B1.";

它似乎在 Linux 上几乎总是 utf-8(CE B1 存储在该希腊字母的数组中)。在 Windows 上,如果系统区域设置为英语,则为 Windows-1252(由于希腊语在 Windows-1252 中不可用,因此存储了一些错误值 3F),以及其他区域设置的一些其他编码(例如 cp936 中的 A6 C1 用于中文区域设置, E1 在 Windows-1253 中用于希腊语言环境,分别代表这两种编码中的希腊小写字母)。对于希腊字母在语言环境中可用(因此在执行字符集中可用)的所有情况,cout << str;可以适本地打印希腊字母。一切似乎都很好。

但是对于执行宽字符集,我不是很了解。它在主要平台上的确切编码是什么?似乎 ISO-10646 值 0x3B1的希腊小写字母 alpha 总是存储在 wchar_t 中对于我尝试过的所有平台上的如下声明:

wchar_t wstr[] = L"Greek lowercase alpha is: \u03B1."; 

所以我猜执行宽字符集很可能是 UCS-2/UTF-16 或 UTF-32(不同的环境对 wchar_t 有不同的大小,Linux 为 4,Windows 为 2)?然而,wcout << wstr;在 Linux 或 Windows 上无法正确打印希腊字母。当然,执行宽字符集的成员和编码是实现定义的,但这对于实现提供的 iostream 应该不是问题。能够适本地识别和处理它,对吗? (虽然执行字符集也是实现定义的,iostream 工具可以很好地处理它。)wchar_t 的默认解释是什么?由 iostream 处理时的数组设施? (无论如何,只是为了澄清,我更感兴趣的是执行宽字符集的性质,而不是找到在某些平台上打印宽字符字符串的正确方法。)

PS:我是wchar_t的新手东西,如果我说错了什么,我深表歉意。

最佳答案

执行宽字符集只是在运行时用于对 wchar_t 进行编码的字符集。参见 N3337 S2.3。

编码是实现定义的。在所有现代系统和平台上,它将是 Unicode (ISO-10646),但没有什么能做到这一点。在 IBM 大型机等较旧的平台上,它可能是 DBCS 或其他不同的东西。您不会看到它,但这是标准允许的。

EWCS 需要有一些特定的成员和转换。它需要与库函数一起正常工作。这些都不是严格的限制。

宽字符实际上可以是 short int(如在 Windows 上)或 int 32(如在 Unix 上)并且仍然是相同的字符集 (Unicode)。

关于c++ - 什么是执行宽字符集及其编码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22033039/

相关文章:

c++ - 一维数组衰减为指针,但二维数组不会衰减,为什么?

c++ - 为什么我的 cout 会同时执行,尽管 cin 应该在其间读取?

在C中逐个字符地比较两个字符串

c - 从 C/C++/Rust 设置 lua 表的方法

html - 如何检测字符集编码?

mysql - 这个网站是如何修复编码的?

c++ - 每个 .cpp 创建两个 LNK2005 错误

c++ - 开发交互式 shell

计算 C 中两个 ISO 8601 日期(包括毫秒)之间的差异

ruby-on-rails - 在我的 Rails 应用程序中适本地处理非 UTF8 内容