5.2.1 字符集
1、两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集)。每个集合此外被划分为一个基本字符集,其内容由本子条款给出,以及一组零个或多个区域特定的成员(这些不是基本字符集的成员),称为扩展字符。这些成员结合起来也被称为扩展字符集。执行字符集的成员的值是由实现定义的。
2、在一个字符常量或字符串字面量中,执行字符集的成员应该由相应的源字符集的成员或通过由倒斜杠\后面跟一到多个字符所构成的转义序列来表示。所以比特均为0的一个字节称为空字符(null character),应该存在于基本执行字符集中;它被用于终止一个字符串。
3、基本源和基本执行字符集应该具有如下成员:拉丁字目表的26个大写字母,
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
拉丁字母表的26个小写字母,
a b c d e f g h i j k l m
n o p q r s t u v w x y z
10个十进制数字,
0 1 2 3 4 5 6 7 8 9
29个图形字符,
! " # % & ' ( ) * + , - . / :
; < = > ? [ \ ] ^ _ { | } ~
空白符,以及表示水平制表、垂直制表和换页的控制字符。源与执行基本字符集的每个成员应该适应在一个字节中。在源和执行字符集中,每个跟在上述十进制数字列表中的0之后的字符应该是一个大于在其之前字符的值。在源文件中,应该有某个方法来指示文本的每一行的结束;本国际标准将这种行结束指示符对待为就好比它是一单个换行字符。在基本执行字符集中,应该要有代表警告、回退、回车、以及换行的控制字符。如果在一个源文件中碰到了任一其它字符(除了在一个标识符、字符常量、字符串字面量、头文件名、注释,或是从不会被转换为一个符记的预处理符记中),那么行为是未定义的。
4、一个字母是上述所定义的一个大写字母或一个小写字母;在本国际标准中,此术语并不包括其它字母表中作为字母的字符[译者注:比如希腊字母αβγ]。
5、通用字符名构建提供了命名其它字符的方法。
5.2.1.1 三字符序列
1、在任一其它处理发生之前,以下三个字符的序列(称为三字符序列[注:三字符序列允许没有定义在ISO/IEC 646中所描述的不变编码集中的字符的输入,ISO/IEC 646是7比特US ASCII码集的一个子集。])每次出现时,都用相应的单个字符来代替。
??= 对应于 # ??) 对应于 ] ??! 对应于 |
??( 对应于 [ ??' 对应于 ^ ??> 对应于 }
??/ 对应于 \ ??< 对应于 { ??- 对应于 ~
没有其它的三字符序列存在。不作为上述所列出的三字符中的其中之一开头的每个?不会进行转义。
2、例1
??=define arraycheck(a, b) a??(b??) ??!??! b??(a??)
// 变为
#define arraycheck(a, b) a[b] || b[a]
3、例2 以下代码行
printf("Eh???/n");
// 变为
printf("Eh?\n");
5.2.1.2 多字节字符
1、源字符集可以包含多字节字符,用于表示扩展字符集的成员。执行字符集也可以包含多字节字符,它们不需要具有与源字符集相同的编码。对于执行字符集与源字符集,应该要保持以下规则:
——基本字符集应该被呈现出来,并且每个字符应该被编码为一单个字节。
——该呈现意味着,任一额外的成员的表示是区域特定的。
——一个多字节字符集可以具有一个依赖状态的编码,其中,多字节字符的每个序列以一个初始档位状态开始,并进入其它区域特定的档位状态,当在此序列中遇到特定的多字节字符时。在初始档位状态时,所有单字节字符仍然保留对它们通常的解释并且不切换档位状态。对该序列中后续字节的解释是当前档位状态的一个函数。
2、对于源文件,应该保持以下规则:
——一个标识符、注释、字符串字面量、字符常量,或头文件名应该在初始档位状态开始和结束。
——一个标识符、注释、字符串字面量、字符常量,或头文件名应该由一序列有效的多字节字符构成。