字符集与编码
此页描述 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) |
[编辑] 执行字符集
执行字符集和执行宽字符集是基本字面量字符集的超集。执行字符集的编码和附加元素集(若有)是locale特定的。执行宽字符集的每个元素都必须能表示为相异的 wchar_t 代码单元。
[编辑] 代码单元与字面量编码
代码单元 是字符类型的整数值。 字符字面量 (多字符或非编码字符字面量除外)或 字符串字面量 中的字符被编码为一个或多个代码单元的序列,这由编码前缀决定;这被称为相应的字面量编码。
字面量编码或执行字符集的 locale 特定编码将基本字面量字符集的每个元素编码为具有非负值的单个代码单元,该值与任何其他此类元素的代码单元不同。不在基本字面量字符集中的字符可以用多个代码单元编码;这种代码单元的值可以与基本字面量字符集元素的代码单元的值相同。执行字符集的编码可能与任何字面量编码无关。
普通字面量编码是应用于普通字符或字符串字面量的编码。宽字面量编码是应用于宽字符或字符串字面量的编码。
U+0000 NULL 字符被编码为值 0。翻译字符集的任何其他元素都不会以值 0 的代码单元编码。在数字 0 (U+0030) 之后的每个十进制数字字符的代码单元值应比前一个值大 1。普通和宽字面量编码在其他方面是实现定义的。
对于 UTF-8、UTF-16 或 UTF-32 字面量,对应于翻译字符集每个字符的 UCS 标量值按照 ISO/IEC 10646 中为相应 UCS 编码形式指定的进行编码。
[编辑] 注解
一些字符集的标准名称在 C++23 中通过 P2314R4 更改。
新名称 | 旧名称 |
---|---|
基本字符集 | 基本源字符集 |
基本字面量字符集 | 基本执行字符集 基本执行宽字符集 |
从源文件 (UTF-8 源文件除外)(自 C++23 起) 字符到 基本字符集(直至 C++23)翻译字符集(自 C++23 起) 在 翻译阶段 1 期间的映射是实现定义的,因此实现需要记录基本源字符在源文件中如何表示。
[编辑] 缺陷报告
下列行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布行为 | 正确行为 |
---|---|---|---|
CWG 788 | C++98 | 执行字符集成员的值 是实现定义的,但不是 locale 特定的 |
它们是 locale 特定的 |
CWG 1796 | C++98 | 基本执行(宽)字符集中的空(宽)字符的表示 拥有所有零位 |
仅要求值为零 |
[编辑] 参见
ASCII 表 | |
C 文档 关于 字符集与编码
|