命名空间
变体
操作

字符集与编码

出自 cppreference.cn
< cpp‎ | language
 
 
C++ 语言
通用主题
流程控制
条件执行语句
if
迭代语句 (循环)
for
范围 for (C++11)
跳转语句
函数
函数声明
Lambda 函数表达式
inline 说明符
动态异常规范 (在 C++17* 中弃用)
noexcept 说明符 (C++11)
异常
命名空间
类型
说明符
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
存储期说明符
初始化
 
 

此页描述 C++ 标准指定的数个字符集。

内容

翻译字符集

翻译字符集 由下列元素构成

  • 每个抽象字符,均在 Unicode 代码空间中被分配了一个码位,及
  • 每个未被分配给抽象字符的 Unicode 标量值,都有一个相异的字符。

翻译字符集是基本字符集和基本字面量字符集(见下文)的超集。

(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

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 波浪号 ~

下列字符自 C++26 起被添加到基本字符集

代码单元 字符 字形
U+0024 美元符号 $
U+0040 商业 @ 符号 @
U+0060 重音符 `
(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 文档 关于 字符集与编码