字符集 - 不清楚

Chu*_*dad 10 c++ character-encoding

标准定义

  • 基本源字符集

  • 基本执行字符集及其广泛的char对应物

它还定义了"执行字符集"及其宽字符对应项,如下所示

$ 2.2/3-"执行字符集和执行宽字符集分别是基本执行字符集和基本执行宽字符集的超集.执行字符集成员的值是实现定义的,并且任何其他成员都是特定于语言环境的."

Q1.我不认为我完全理解这一点,特别是最后的陈述.有关这方面的任何指示?

进一步,

$ 3.9.1 - "声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员."

Q2.在3.9.1中,短语"基本字符集"表示"基本执行字符集"?

jok*_*oke 17

您需要区分源字符集,执行字符集,线程执行字符集及其基本版本:

基本源字符集:

§2.1.1:基本源字符集由96个字符组成[...]

此字符集恰好有96个字符.它们适合7位.像这样@的人物不包括在内.

让我们为一些基本的源字符获得一些示例二进制表示.它们可以是完全任意的,并且不需要这些对应于ASCII值.

A -> 0000000
B -> 0100100
C -> 0011101
Run Code Online (Sandbox Code Playgroud)

基本执行字符集......

§2.1.3:基本执行字符集和基本执行宽字符集应各自包含基本源字符集的所有成员,以及表示alert,backspace和回车符的控制字符,以及空字符(分别为null宽字符),其表示具有全零位.

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

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

A          -> 10110101010
B          -> 00001000101    <- basic source character set
C          -> 10101011111
----------------------------------------------------------
null       -> 00000000000
Backspace  -> 11111100011
Run Code Online (Sandbox Code Playgroud)

如果基本执行字符集长度为11位(如本例所示),则char数据类型应足够大以存储11位,但可能更长.

...和基本的执行宽字符集:

基本执行宽字符用于宽字符(wchar_t).它基本上与基本执行宽字符集相同,但也可以有不同的二进制表示.

A          -> 1011010101010110101010
B          -> 0000100010110101011111    <- basic source character set
C          -> 1010100101101000011011
---------------------------------------------------------------------
null       -> 0000000000000000000000
Backspace  -> 1111110001100000000001
Run Code Online (Sandbox Code Playgroud)

唯一的固定成员是空字符,它需要是一个0位序列.

在基本字符集之间转换:

§2.1.1.5:字符文字和字符串文字中的每个源字符集成员,转义序列或通用字符名称都将转换为执行字符集的成员(2.13.2,2.13.4).

然后编译c ++源文件,将源字符集的每个字符转换为基本执行(宽)字符集.

例:

const char* string0   =  "BA\bC";
const wchar_t string1 = L"BA\bC";
Run Code Online (Sandbox Code Playgroud)

由于string0是普通字符,因此它将转换为基本执行字符集,string1并将转换为基本的执行宽字符集.

string0 -> 00001000101 10110101010 11111100011 10101011111
string1 -> 0000100010110101011111 1011010101010110101010    // continued
           1111110001100000000001 1010100101101000011011
Run Code Online (Sandbox Code Playgroud)

关于文件编码的一些事情:

有几种文件编码.例如ASCII,它是7位长.Windows-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 ö, Ä, ô, Ð.";
Run Code Online (Sandbox Code Playgroud)

这些字符无法表示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
Run Code Online (Sandbox Code Playgroud)

使用UTF-8和UTF-32作为默认编码,c ++源文件可以包含具有任何语言字符的字符串.UTF-8字符可以双向转换而不会出现问题.

扩展字符集:

§1.1.3:多字节字符,一个或多个字节的序列,表示源或执行环境的扩展字符集的成员.扩展字符集是基本字符集(2.2)的超集.

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

根据用户运行时环境中设置的语言环境处理多字节字符.这些多字节字符在运行时转换为用户环境中的编码集.

  • 这句话有点难以理解:“如果您可以键入字符 ; 在选择作为源文件编码的编码范围内,该编码不适合作为 c++ 源文件编码。” 这是什么意思? (2认同)