标准中提到了很多与字符集相关的概念:基本源字符集,基本执行字符集,基本执行宽字符集,执行字符集和执行宽字符集:
我对基本源字符集,基本执行字符集和基本执行宽字符集没有太多疑问。
对于执行字符集,标准表示它是实现定义的和特定于语言环境的,所以我试着通过观察字符串文字初始化的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
数组的默认解释是什么? (无论如何,只是为了澄清,我对执行宽字符集的性质更感兴趣,而不是找到在某些平台上打印宽字符串的正确方法。)
wchar_t
的东西都是新手,所以如果我说错了,我会道歉。
答案 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。