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

时间:2014-02-26 05:58:56

标签: 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中不可用,则存储了一些错误的值3F),以及其他区域设置的其他编码(例如cp936中的A6 C1),则为Windows-1252对于中文语言环境,在Windows-1253中为希腊语语言环境E1,分别代表这两种编码中的希腊小写字母alpha)。对于希腊字母在区域设置中可用的所有情况(因此在执行字符集中可用),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,大多数情况下为2)?但是,wcout << wstr;无法在Linux或Windows上正确打印希腊字母。当然,执行宽字符集的成员和编码是实现定义的,但对于实现提供的iostream工具来说,这应该不是一个问题,以便适当地识别和处理它,对吧? (虽然执行字符集也是实现定义的,但iostream工具可以正常处理它。)wchar_t工具处理时iostream数组的默认解释是什么? (无论如何,只是为了澄清,我对执行宽字符集的性质更感兴趣,而不是找到在某些平台上打印宽字符串的正确方法。)

PS:我对wchar_t的东西都是新手,所以如果我说错了,我会道歉。

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

相关问题