标准定义
-
基本源字符集
-
基本执行字符集及其宽字符对应
它还定义了“执行字符集”及其宽字符对应项,如下所示
$ 2.2 / 3-“执行字符集和执行宽字符集分别是基本执行字符集和基本执行宽字符集的超集 . 执行字符集成员的值是实现定义的,以及任何其他成员都是特定于语言环境的 . “
Q1 . 我不认为我完全理解这一点,特别是最后的陈述 . 有关这方面的任何指示?
进一步,
$ 3.9.1 - “声明为字符(char)的对象应足够大,以存储实现的基本字符集的任何成员 . ”
Q2 . 在3.9.1中,短语“基本字符集”表示“基本执行字符集”?
1 回答
您需要区分源字符集,执行字符集,线程执行字符集及其基本版本:
The basic source character set:
此字符集恰好有96个字符 . 它们适合7位 . 像
@
这样的字符不包括在内 .让我们为一些基本的源字符获得一些示例二进制表示 . 它们可以是完全任意的,并且不需要这些对应于ASCII值 .
The basic execution character set …
如上所述,基本执行字符集包含基本源字符集的所有成员 . 它仍然不包括任何其他字符,如
@
. 基本执行字符集可以具有不同的二进制表示 .如上所述,基本执行字符集包含回车符,空字符和其他字符的表示 .
如果基本执行字符集长度为11位(如本例所示),则char数据类型应足够大以存储11位,但可能更长 .
… and The basic execution wide character set:
基本执行宽字符用于宽字符(wchar_t) . 它基本上与基本执行宽字符集相同,但也可以有不同的二进制表示 .
唯一的固定成员是空字符,它需要是
0
位的序列 .Converting between basic character sets:
然后编译c源文件,将源字符集的每个字符转换为基本执行(宽)字符集 .
例:
由于
string0
是普通字符,因此它将转换为基本执行字符集,string1
将转换为基本执行宽字符集 .Something about file encodings:
有几种文件编码 . 例如ASCII,其长度为7位 . Windows-1252这是8位长(称为
ANSI
) .ASCII
不包含非英文字符 .ANSI
包含一些欧洲字符,如ä Ö ä Õ ø
.较新的文件编码(如UTF-8或UTF-32)可以包含任何语言的字符 .
UTF-8
是字符长度可变 .UTF-32
长度为32位字符 .File enconding requirements:
大多数编译器都提供命令行开关来指定源文件的文件编码 .
需要以文件编码对c源文件进行编码,该文件编码具有基本源字符集的表示 . 例如:源文件的文件编码需要具有
;
字符的表示 .如果您可以在选择的编码中键入字符
;
作为源文件的编码,该编码不适合作为c源文件编码 .Non-basic character sets:
未包括在基本源字符集中的字符属于源字符集 . 源字符集等同于文件编码 .
例如:
@
字符不包含在基本源字符中,但可以包含在源字符集中 . 选择的文件编码输入源文件可能包含@
的表示形式 . 如果它不包含@
的表示,则不能在字符串中使用字符@
.不包括在基本(宽)字符集中的字符属于执行(宽)字符集 .
请记住,编译器将字符从源字符集转换为执行字符集和执行范围字符集 . 因此,需要知道如何转换这些字符 .
例如:如果指定
Windows-1252
作为源字符集的编码并指定ASCII
作为执行宽字符集,则无法转换此字符串:这些字符无法在
ASCII
中表示 .Specifying character sets:
以下是如何使用gcc指定字符集的一些示例 . 包含默认值 .
使用UTF-8和UTF-32作为默认编码,c源文件可以包含具有任何语言字符的字符串 . UTF-8字符可以双向转换而不会出现问题 .
The extended character set:
多字节字符比普通字符的条目长 . 它们包含一个转义序列,将它们标记为多字节字符 .
根据用户运行时环境中设置的语言环境处理多字节字符 . 这些多字节字符在运行时转换为用户环境中的编码集 .