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

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?
");



5.2.1.2 多字节字符


1、源字符集可以包含多字节字符,用于表示扩展字符集的成员。执行字符集也可以包含多字节字符,它们不需要具有与源字符集相同的编码。对于执行字符集与源字符集,应该要保持以下规则:

——基本字符集应该被呈现出来,并且每个字符应该被编码为一单个字节。

——该呈现意味着,任一额外的成员的表示是区域特定的。

——一个多字节字符集可以具有一个依赖状态的编码,其中,多字节字符的每个序列以一个初始档位状态开始,并进入其它区域特定的档位状态,当在此序列中遇到特定的多字节字符时。在初始档位状态时,所有单字节字符仍然保留对它们通常的解释并且不切换档位状态。对该序列中后续字节的解释是当前档位状态的一个函数。

2、对于源文件,应该保持以下规则:

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

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

原文地址:https://www.cnblogs.com/zenny-chen/p/4246337.html