Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是执行范围的字符集及其编码?_C++_C_Character Encoding_Language Lawyer - Fatal编程技术网

C++ 什么是执行范围的字符集及其编码?

C++ 什么是执行范围的字符集及其编码?,c++,c,character-encoding,language-lawyer,C++,C,Character Encoding,Language Lawyer,标准中提到了许多与字符集相关的概念:基本源字符集、基本执行字符集、基本执行范围字符集、执行字符集和执行范围字符集: 基本源字符集:91个图形字符,加上空格字符、HT、VT、FF、LF(仅借用ASCII的名称缩写) 基本执行(宽)字符集:基本源字符集的所有成员,加上BEL、BS、CR、(宽)NUL 执行字符集和执行范围字符集分别是基本执行字符集和基本执行范围字符集的实现定义超集。执行字符集的成员和其他成员集的值是特定于语言环境的 对于基本源字符集、基本执行字符集和基本执行范围字符集,我没有太多

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

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

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


在Linux上似乎几乎总是utf-8(
CEB1
存储在该希腊字母的数组中)。在Windows上,如果系统语言环境为英语,则为Windows-1252(由于在Windows-1252中没有希腊字母,所以存储了一些错误的值
3F
),而对于其他语言环境则为其他编码(例如,cp936中的
A6 C1
用于中文区域设置,Windows-1253中的
E1
用于希腊文区域设置,分别表示这两种编码中的希腊文小写字母alpha)。对于所有希腊文字母在区域设置中可用的情况(因此在执行字符集中可用),
cout基本上char使用1个字节编码符号,用于ANSII文本。如果应用程序仅处理拉丁语,则可以使用。如果要支持所有其他语言,例如俄语,则必须使用多字节或Unicode编码。这是wchar_t很有用的地方。如果您编写sizeof(wchar_t)您将看到2个字节用于编码符号


当您决定使用wchar\u t(宽字符)时,必须使用支持此类型的函数。您会发现许多字符串函数(fopen\u s,string)对wchar\u t有模拟:wfopen\u s,wstring。

执行宽字符集只是运行时用于编码wchar\u t的字符集。请参阅N3337 S2.3

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

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


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

请注意,这适用于Windows。在Linux中,字符字符串采用utf-8编码(处理大多数文本相关情况的首选方法)和使用utf-32的4字节wchar\u t。感谢您的共享。虽然执行字符集和执行范围字符集都是实现定义的,但iostream工具始终可以正确处理执行字符集(Linux上的utf-8和Windows上的各种代码页编码),但无法正确处理执行范围内的字符集(至少在预先进行某些设置时不会)。是否因为标准对此没有任何要求,所以标准库实施者可以自由地简化他们的工作?如果您有具体的想法,请编辑您的问题。我很乐意尝试回答,但您需要提供一个具体的示例(SSEEC)。有没有办法知道程序的EWCS是什么?例如,如果我在源代码中有一个宽字符串文字,并想将其转换为UTF8,许多转换函数都想知道源代码的编码方式。@enno:EWCS是开发人员的选择,反映在编辑器(源代码文本)、编译器(字符串文字)的选择中和运行时(字符串转换和库函数)。如果您选择IBM EBCDIC编辑器、编译器和运行时,您的EWC是EBCDIC。除非您有其他需要,否则现在的答案几乎肯定是Unicode。
char str[] = "Greek lowercase alpha is: \u03B1.";
wchar_t wstr[] = L"Greek lowercase alpha is: \u03B1.";