字符集和它的编码?

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

  • 基本源字符集:91个图形字符,加上空格字符,HT,VT,FF,LF(仅从ASCII中借用名称缩写)。
  • 基本执行(宽 - )字符集:基本源字符集的所有成员,加上BEL,BS,CR,(宽 - )NUL。
  • 执行字符集和执行宽字符集分别是基本执行字符集和基本执行宽字符集的实现定义的超集。 执行字符集的成员和额外成员集的值是特定于语言环境的。
  • 对于基本源字符集,基本执行字符集和基本执行宽字符集,我没有太多问题。

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

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

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

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

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

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

    PS:我是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_s,wstring。

    链接地址: http://www.djcxy.com/p/68391.html

    上一篇: character set and its encoding?

    下一篇: C standard : Character set and string encoding specification