字符集与编码
本页面描述 C++ 标准所指定的几个字符集。
翻译字符集翻译字符集含有以下元素:
翻译字符集是基本字符集与基本字面量字符集(见后述)的超集。 |
(C++23 起) |
基本字符集
基本字符集是翻译字符集的一个子集,它含有以下 96 (C++26 前)99 (C++26 起) 个字符:
代码单元 | 字符 | 字形 |
---|---|---|
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
|
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
|
U+007B | 左波形括号 | {
|
U+007C | 竖线 | |
|
U+007D | 右波形括号 | }
|
U+007E | 波浪符 | ~
|
C++26 起下列字符被添加到基本字符集:
|
(C++26 起) |
基本字面量字符集
基本字面量字符集 含有基本字符集的所有字符,外加以下控制字符:
代码单元 | 字符 |
---|---|
U+0000 | 空 |
U+0007 | 响铃 |
U+0008 | 退格 |
U+000D | 回车(CR) |
执行字符集
执行字符集和执行宽字符集是基本字面量字符集的超集。执行字符集的编码和额外元素(如果存在)的集合受地区设定影响。执行宽字符集中的每个字符都必须能够以不同的 wchar_t 代码单元表示。
代码单元与字面量编码
代码单元是字符类型的一个整数值。在除了多字符和不可编码字符字面量以外的字符字面量中的字符,和在字符串字面量中的字符会以编码前缀被编码为一个含有一个或多个编码单元的序列,这被称为对应的字面量编码。
字面量编码或执行字符集的受地区设定影响的编码会将基本字面量字符集的每个元素编码为一个具有非负值的代码单元,而且它与其他任何元素编码的代码单元都不相同。基本字面量字符集以外的字符可以被编码为多个代码单元;这样编码出来的某个编码单元可以和基本字面量字符集中的字符编码的编码单元一致。执行字符集的编码可以和任何字面量编码都不相关。
通常字面量编码是应用到通常字符字面量和通常字符串字面量的编码。宽字面量编码是应用到宽字符字面量和宽字符串字面量的编码。
U+0000 会被编码为零值。翻译字符集的其他任何元素都不能被编码为具有零值的代码单元。每个数位零(U+0030)后的数位字符的代码单元值都应该比上一个字符的值大一。 通常字面量编码和宽字面量编码的其他部分都由实现定义。
对于 UTF-8,UTF-16 和 UTF-32 字面量,翻译字符集中每个字符对应的 UCS 标量值都会以 ISO/IEC 10646 中分别对应的 UCS 编码形式的说明进行编码。
注解
一些字符集的标准名在 C++23 中经由 P2314R4 改动。
新名 | 旧名 |
---|---|
基本字符集 | 基本源字符集 |
基本字面量字符集 | 基本执行字符集 基本执行宽字符集 |
从(UTF-8 源文件以外的) (C++23 起)源文件的字符到基本字符集 (C++23 前)翻译字符集 (C++23 起)字符集的映射(在翻译阶段1中所述)由实现决定,因此实现需要在其文档记载基本源字符如何在源文件里表示。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
CWG 788 | C++98 | 执行字符集的成员的值由实现定义,但不受地区设定影响 | 改为受地区设定影响 |
CWG 1796 | C++98 | 基本执行(宽)字符集中空(宽)字符的表示的所有位均需为 0 | 只需要值为 0 |
参阅
ASCII 码表 |