字符集与编码

来自cppreference.com
< cpp‎ | language

当前字符集 (C++23 起)

翻译字符集

翻译字符集 含有以下元素:

  • 每个由 ISO/IEC 10646 命名的字符,通过它独特的 UCS 标量值标识,和
  • 没有赋予命名字符的 UCS 标量对应的每个不同的字符

基础字符集

基础字符集 是翻译字符集的一个子集,它含有以下96个字符:

代码单元 字符 字形
U+0009 横向制表
U+000B 纵向制表
U+000C 换页(FF)
U+0020 空格
U+000A 换行(LF) 新行
U+0021 感叹号 !
U+0022 问号 "
U+0023 数字符号 #
U+0025 百分号 %
U+0026 和号 &
U+0027 撇号 '
U+0028 左圆括号 (
U+0029 右圆括号 )
U+002A 星号 *
U+002B 加号 +
U+002C 逗号 ,
U+002D 连字符/减号 -
U+002E 句号 .
U+002F 斜线 /
U+0030 .. U+0039 数位 零到九 0 1 2 3 4 5 6 7 8 9
U+003A 冒号 :
U+003B 分号 ;
U+003C 小于号 <
U+003D 等号 =
U+003E 大于号 >
U+003F 问号 ?
U+0041 .. U+005A 拉丁大写字母 A到Z 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

U+005B 左方括号 [
U+005C 反斜线 \
U+005D 右方括号 ]
U+005E 抑扬音符号 ^
U+005F 下划线 _
U+0061 .. U+007A 拉丁小写字母 a到z 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

U+007B 左波形括号 {
U+007C 竖线 |
U+007D 右波形括号 }
U+007E 波浪符 ~

基础字面量字符集

基础字面量字符集 含有基础字符集的所有字符,外加以下控制字符:

代码单元 字符
U+0000
U+0007 响铃
U+0008 退格
U+000D 回车(CR)

执行字符集

执行字符集执行宽字符集 是基础字面量字符集的超集。执行字符集的编码和额外元素(如果存在)的集合受地区设定影响。

代码单元与字面量编码

代码单元 是字符类型的一个整数值。在除了多字符和不可编码字符字面量以外的字符字面量中的字符,和在字符串字面量中的字符会以编码前缀被编码为一个含有一个或多个编码单元的序列,这被称为对应的 字面量编码

字面量编码或执行字符集的受地区设定影响的编码会将基础字面量字符集的每个元素编码为一个具有非负值的代码单元,而且它与其他任何元素编码的代码单元都不相同。基础字面量字符集以外的字符可以被编码为多个代码单元;这样编码出来的某个编码单元可以和基础字面量字符集中的字符编码的编码单元一致。执行字符集的编码可以和任何字面量编码都不相关。

通常字面量编码是应用到通常字符字面量和通常字符串字面量的编码。宽字面量编码是应用到宽字符字面量和宽字符串字面量的编码。

U+0000 会被编码为零值。翻译字符集的其他任何元素都不能被编码为具有零值的代码单元。每个数位零(U+0030)后的数位字符的代码单元值都应该比上一个字符的值大一。 通常字面量编码和宽字面量编码的其他部分都由实现定义。

对于 UTF-8,UTF-16 和 UTF-32 字面量,翻译字符集中每个字符对应的 UCS 标量值都会以 ISO/IEC 10646 中分别对应的 UCS 编码形式的说明进行编码。

C++23 前的字符集 (C++23 前)

基础源字符集

基础源字符集 含有以下96个字符:

  • 空格字符,
  • 表示以下内容的控制字符:
    • 横向制表符,
    • 纵向制表符,
    • 换页,
    • 以及换行,
  • 外加以下91个图形字符:
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
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
0 1 2 3 4 5 6 7 8 9
_ { } [ ] # ( ) < > % : ; . ? * + - / ^ & | ~ ! = , \ "

基础源字符集的成员的字形是为了标识 ISO/IEC 10646 中对应 ASCII 字符集的子集的字符。然而由于从源文件的字符到源字符集的映射(在翻译阶段1中所述)由实现决定,因此实现需要在其文档记载基础源字符如何在源文件里表示。

基础执行字符集

基础执行字符集基础执行宽字符集 包含基础源字符集的所有成员,外加表示警报(响铃),退格和回车的控制字符,以及值为 0 的空字符(对应的有空宽字符)。

对于每个基础执行字符集,成员的值均不得为负,且各不相同。在基础源字符集和基础执行字符集中,在上述列表中的数位列表里每个 0 之后的字符的值都应该比上一个字符的值大一。

执行字符集(旧定义)

执行字符集执行宽字符集 分别是基础执行字符集和基础执行宽字符集的由实现定义的超集。执行字符集的成员的值和额外成员的集合受地区设定影响。

参阅

ASCII 码表