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

goo*_*era 6 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.";
Run Code Online (Sandbox Code Playgroud)

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

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

wchar_t wstr[] = L"Greek lowercase alpha is: \u03B1."; 
Run Code Online (Sandbox Code Playgroud)

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

PS:我是新手wchar_t,所以我道歉,如果我说错了.

小智 0

基本上 char 使用 1 个字节来编码符号并用于 ANSII 文本。如果您的应用程序仅处理拉丁语,那么可以使用它。如果要支持所有其他语言(例如俄语),则必须使用多字节或 Unicode 编码。这就是 wchar_t 有用的地方。如果你写 sizeof(wchar_t) 你会看到 2 个字节被用来编码一个符号。

当您决定使用wchar_t(宽字符)时,您必须使用支持该类型的函数。您会发现许多字符串函数(fopen_s、string)都与 wchar_t 类似:_wfopen_s、wstring。