字符集与编码

来自cppreference.com
< cpp‎ | language


 
 
 
 

本页面描述 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 到 ZA 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 到 za 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商业用 At 符号@
U+0060抑音符`
(C++26 起)

基本字面量字符集

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

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

执行字符集

执行字符集 和执行宽字符集 是基本字面量字符集的超集。执行字符集的编码和额外元素(如果存在)的集合受本地环境影响。执行宽字符集中的每个字符都必须能够以一个不同的 wchar_t 代码单元表示。

代码单元与字面量编码

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

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

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

字符 U+0000 NULL 被编码为零值。翻译字符集的其他任何元素都不能被编码为具有零值的代码单元。数字“0”(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 788C++98执行字符集的成员的值由实现定义,但不受本地环境影响改为受本地环境影响
CWG 1796C++98基本执行(宽)字符集中空(宽)字符的表示的所有位均需为 0只需要值为 0

参阅

ASCII 码表
字符集与编码C 文档