标准定义
它还定义了“执行字符集”及其宽字符对应,如下所示
$2.2/3-“执行字符集和执行宽字符集分别是基本执行字符集和基本执行宽字符集的超集,执行字符集成员的值是实现定义的,任何附加成员都是特定于地区的。”
Q1。我不认为我完全理解这一点,尤其是最后的陈述。在这方面有什么建议吗?
此外,
$3.9.1 -“声明为字符(char)的对象应该足够大,足以存储实现的基本字符集的任何成员。
Q2。在3.9.1中,“基本字符集”的意思是“基本执行字符集”?
发布于 2010-11-22 18:05:56
您需要区分源字符集、执行字符集、线执行字符集及其基本版本:
基本源字符集:
§2.1.1:基本源字符集由96个字符…组成
这个字符集正好有96个字符。它们适合7位。不包括像@这样的字符。
让我们为一些基本的源字符获取一些二进制表示。它们可以是完全任意的,不需要它们对应于ASCII值。
A -> 0000000
B -> 0100100
C -> 0011101基本执行字符集…
§2.1.3:基本执行字符集和基本执行宽字符集都应包含基本源字符集的所有成员,加上表示警报、后退和回车的控制字符,加上一个空字符(分别为空宽字符),其表示形式为零位。
如前所述,基本执行字符集包含基本源字符集的所有成员。它仍然不包括像@这样的任何其他字符。基本执行字符集可以有不同的二进制表示形式。
如前所述,基本执行字符集包含用于回车、空字符和其他字符的表示。
A -> 10110101010
B -> 00001000101 <- basic source character set
C -> 10101011111
----------------------------------------------------------
null -> 00000000000
Backspace -> 11111100011如果基本执行字符集是11位长(如本例所示),则char数据类型应该足够大以存储11位,但它可能更长。
…和基本的执行宽字符集:
基本的执行宽字符用于宽字符(wchar_t)。它与基本的执行宽字符集基本相同,但也可以有不同的二进制表示形式。
A -> 1011010101010110101010
B -> 0000100010110101011111 <- basic source character set
C -> 1010100101101000011011
---------------------------------------------------------------------
null -> 0000000000000000000000
Backspace -> 1111110001100000000001唯一固定的成员是空字符,它需要是一个0位序列。
基本字符集之间的转换:
§2.1.1.5:字符文本和字符串文本中的每个源字符集成员、转义序列或通用字符名称被转换为执行字符集的一个成员(2.13.2,2.13.4)。
然后编译c++源文件,将源字符集的每个字符转换为基本的执行(wide)字符集。
示例:
const char* string0 = "BA\bC";
const wchar_t string1 = L"BA\bC";由于string0是一个普通字符,它将被转换为基本执行字符集,而string1将转换为基本执行宽字符集。
string0 -> 00001000101 10110101010 11111100011 10101011111
string1 -> 0000100010110101011111 1011010101010110101010 // continued
1111110001100000000001 1010100101101000011011有关文件编码的内容:
有几种文件编码。例如ASCII,它有7位长。Windows-1252,8位长(称为ANSI)。ASCII不包含非英语字符.ANSI包含一些欧洲字符,比如ä Ö ä Õ ø。
较新的文件编码(如UTF-8或UTF-32 )可以包含任何语言的字符。UTF-8是字符的长度是可变的。UTF-32长32位字符。
文件输入要求:
大多数编译器提供命令行开关来指定源文件的文件编码。
c++源文件需要在具有基本源字符集表示的文件编码中进行编码。例如:源文件的文件编码需要有一个;字符的表示。
如果可以在选择为源文件编码的编码中键入字符;,则该编码不适合作为c++源文件编码。
非基本字符集:
基本源字符集中未包含的字符属于源字符集。源字符集与文件编码等效。
例如:@字符不包含在基本源字符中,但它可能包含在源字符集中。选择的输入源文件的文件编码可能包含@的表示形式。如果它不包含@的表示形式,则不能在字符串中使用字符@。
基本(宽)字符集中没有包含的字符属于执行(宽)字符集。
请记住,编译器将字符从源字符集转换为执行字符集和执行范围字符集。因此,需要有如何转换这些字符的方法。
例如:如果将Windows-1252指定为源字符集的编码,并指定ASCII作为执行范围的字符集,则无法转换此字符串:
const char* string0 = "string with European characters ö, Ä, ô, Ð.";这些字符不能用ASCII表示。
指定字符集:
下面是一些例子,如何使用gcc指定字符集。其中包括默认值。
-finput-charset=UTF-8 <- source character set
-fexec-charset=UTF-8 <- execution character set
-fwide-exec-charset=UTF-32 <- execution wide character set使用UTF-8和UTF-32作为默认编码,c++源文件可以包含任何语言字符的字符串。UTF-8字符可以无问题地转换成两种方式.
扩展字符集:
§1.1.3:多字节字符,由一个或多个字节组成的序列,表示源或执行环境的扩展字符集的成员。扩展字符集是基本字符集(2.2)的超集。
多字节字符比普通字符的条目长。它们包含一个转义序列,将它们标记为多字节字符。
多字节字符根据用户运行时环境中的区域设置进行处理。这些多字节字符在运行时转换为用户环境中的编码集。
https://stackoverflow.com/questions/3768363
复制相似问题