什么是执行范围内的字符集及其编码

What is execution wide-character set and its encoding?

本文关键字:编码 字符集 执行 范围内 什么      更新时间:2023-10-16

标准中提到了相当多与字符集相关的概念:基本源字符集、基本执行字符集、基础执行范围字符集、执行字符集和执行范围字符集合:

  • 基本源字符集:91个图形字符,加上空格字符、HT、VT、FF、LF(仅借用ASCII中的名称缩写)
  • 基本执行(宽)字符集:基本源字符集的所有成员,加上BEL、BS、CR、(宽)NUL
  • 执行字符集和执行范围字符集分别是基本执行字符集的实现定义超集和基本执行范围字符集合。执行字符集的成员值和附加成员集的值是特定于区域设置的

我对基本源字符集、基本执行字符集和基本执行范围字符集没有太多问题。

至于执行字符集,标准规定它是由实现定义的,并且是特定于区域设置的,因此,我试图通过观察字符串初始化的字符数组的字节内容来获得一些真正的意义,该数组的值应该等于执行字符集中字符编码的数值(由于多字节编码,通用字符名可能映射到多个字符元素):

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

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

但对于执行范围内的字符集,我不是很理解。它在主要平台上的确切编码是什么?希腊小写字母alpha的ISO-10646值0x3B1似乎总是存储在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功能可以很好地处理它。)当由iostream功能处理时,wchar_t数组的默认解释是什么?(无论如何,为了澄清,我更感兴趣的是执行范围字符集的性质,而不是在某些平台上找到打印宽字符串的正确方法。)

附言:我对wchar_t的东西完全是个新手,所以如果我说错了什么,我道歉。

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

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

EWCS需要有一些特定的成员和转换。它需要正确使用库函数。这些都不是严格的限制。

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

基本上,char使用1个字节对符号进行编码,用于ANSII文本。如果您的应用程序只涉及拉丁语,则可以使用它。如果要支持所有其他语言,例如俄语,则必须使用多字节或Unicode编码。这就是wchar_t有用的地方。如果您编写sizeof(wchar_t),您将看到2个字节用于对符号进行编码。

当您决定使用wchar_t(宽字符)时,必须使用支持此类型的函数。您会发现,许多字符串函数(fopen_s,string)对wchar_t:_wfopen_ss,wstring具有模拟功能。