2010-09-22 39 views
10

该标准定义字符集 - 不明确

  • 基本源字符集

  • 基本执行字符集及其宽字符对应

它还定义“执行字符集'及其宽字符对应如下

$ 2.2/3-“执行字符集 和执行宽字符集 分别是基本执行 字符集和基本执行 宽字符集的超集。执行 字符集的成员的 值 实现定义,以及任何额外 成员 区域设置特定的“。

Q1。我不认为我明白这一点完全,特别是最后一条语句在这方面的任何指针

此外,

$ 3.9.1 - ?声明 字符(字符)”的对象应是大 足以存储 实现的基本字符集的任何成员。“

Q2。 3.9.1短语'基本字符集'是指'基本执行字符集'?

回答

16

你需要做的源代码字符集,执行字符集,线材执行字符集之间的区别,它的基本版本:

基本源字符集:

§2.1。 1:基本源字符集由96个字符组成[012]

该字符集恰好有96个字符。它们适合7位。不包括@等字符。

让我们来看几个基本源字符的二进制表示。它们可以是完全任意的,并且不需要这些对应于ASCII值。

A -> 0000000 
B -> 0100100 
C -> 0011101 

基本执行字符集...

§2.1.3:基本执行字符集和基本执行宽字符集应分别包含基本源字符的所有成员设置,加上代表alert,backspace和回车的控制字符,加上一个空字符(分别为空宽字符),其表示全部为零。

如前所述,基本执行字符集包含基本源字符集的所有成员。它仍然不包含任何其他字符,如@。基本执行字符集可以具有不同的二进制表示。

如前所述,基本执行字符集包含回车符,空字符和其他字符的表示。

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++源文件编译源代码字符集的每个字符被转换为基本执行(宽)的字符集。

实施例:

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 

一些关于文件编码:

有几种文件编码。例如,长度为7位的ASCIIWindows-1252这是8位长(称为ANSI)。 ASCII不包含非英文字符。 ANSI包含一些欧洲字符,如ä Ö ä Õ ø

较新的文件编码,如UTF-8UTF-32可以包含任何语言的字符。 UTF-8是字符长度可变。 UTF-32是32位字符长。

文件enconding要求:

大多数编译器提供命令行开关来指定源文件的文件编码。

一个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)的超集。

多字节字符比正常字符的条目长。它们包含一个转义序列,将它们标记为多字节字符。

多字节字符是根据用户运行环境中设置的区域设置进行处理的。这些多字节字符在运行时会转换为用户环境中设置的编码。

+1

这句话有点难以遵循:“如果可以键入字符;在编码中选择编码作为源文件的编码,那么编码不适合作为C++源文件编码。”这是什么意思? – JCx 2014-12-29 23:04:07

+0

我认为'-fexec-charset = UTF-8'是一个不好的例子,因为它不符合标准。这个想法很清楚:_basic执行字符集_应该是Unicode,但是(正如你自己突出显示的那样)'char'应该是20位宽以保存所有的Unicode值。然而'UTF-8'是一种可变长度编码,这意味着它只适用于_extended字符集_。 – MSalters 2015-04-01 14:34:35