ISO/IEC 9899:2011 条款5——5.2.1 字符集

时间:2021-05-26 03:08:50

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、对于源文件,应该保持以下规则:

——一个标识符、注释、字符串字面量、字符常量,或头文件名应该在初始档位状态开始和结束。

——一个标识符、注释、字符串字面量、字符常量,或头文件名应该由一序列有效的多字节字符构成。