Namespaces
Variants

Character sets and encodings

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

На этой странице описаны несколько наборов символов, определенных стандартом C++.

Содержание

Набор символов трансляции

Набор символов трансляции состоит из следующих элементов:

  • каждый абстрактный символ, которому назначена кодовая точка в Unicode кодовом пространстве, и
  • отдельный символ для каждого скалярного значения Unicode, не назначенного абстрактному символу.

Набор символов трансляции является надмножеством базового набора символов и базового набора символов литералов (см. ниже).

(начиная с C++23)

Базовый набор символов

Базовый набор символов состоит из следующих 96 (до C++26) 99 (начиная с C++26) символов:

Кодовая позиция Символ Глиф
U+0009 Табуляция символов
U+000B Вертикальная табуляция
U+000C Перевод страницы (FF)
U+0020 Пробел
U+000A Перевод строки (LF) new-line
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 Dollar Sign $
U+0040 Commercial At @
U+0060 Grave Accent `
(since C++26)

Базовый набор символов литералов

Базовый набор символьных литералов состоит из всех символов базового набора символов, плюс следующие управляющие символы:

Кодовая точка Символ
U+0000 Null
U+0007 Bell
U+0008 Backspace
U+000D Возврат каретки (CR)

Исполняемый набор символов

Набор символов выполнения и расширенный набор символов выполнения являются надмножествами базового набора символов литералов. Кодировки наборов символов выполнения и наборы дополнительных элементов (если таковые имеются) зависят от локали. Каждый элемент расширенного набора символов выполнения должен быть представим в виде отдельной wchar_t кодовой единицы.

Кодовая единица и кодирование литералов

Кодовая единица — это целочисленное значение символьного типа. Символы в символьном литерале , кроме многобайтового или не кодируемого символьного литерала, или в строковом литерале кодируются как последовательность из одной или нескольких кодовых единиц, определяемая префиксом кодировки; это называется соответствующим литеральным кодированием .

Литеральная кодировка или локально-специфичная кодировка одного из исполнительных наборов символов кодирует каждый элемент базового набора литеральных символов как отдельную кодовую единицу с неотрицательным значением, отличную от кодовой единицы для любого другого такого элемента. Символ, не входящий в базовый набор литеральных символов, может быть закодирован более чем одной кодовой единицей; значение такой кодовой единицы может совпадать со значением кодовой единицы для элемента базового набора литеральных символов. Кодировки исполнительных наборов символов могут быть несвязанными с любой литеральной кодировкой.

Обычная кодировка литералов — это кодировка, применяемая к обычным символьным или строковым литералам. Широкая кодировка литералов — это кодировка, применяемая к широким символьным или строковым литералам.

Символ U+0000 NULL кодируется значением 0. Ни один другой элемент набора символов трансляции не кодируется кодовой единицей со значением 0. Значение кодовой единицы каждого символа десятичной цифры после цифры 0 (U+0030) должно быть на единицу больше значения предыдущей. Обычная и расширенная кодировки литералов в остальном определяются реализацией.

Для UTF-8, UTF-16 или UTF-32 литерала, скалярное значение UCS, соответствующее каждому символу трансляционного набора символов, кодируется в соответствии со спецификацией ISO/IEC 10646 для соответствующей формы кодирования UCS.

Примечания

Стандартные названия некоторых наборов символов изменены в C++23 посредством P2314R4 .

Новое название(я) Старое название(я)
basic character set basic source character set
basic literal character set basic execution character set
basic execution wide-character set

Отображение символов из исходного файла (кроме UTF-8 исходного файла) (начиная с C++23) в базовый набор символов (до C++23) набор символов трансляции (начиная с C++23) во время фазы трансляции 1 определяется реализацией, поэтому от реализации требуется документировать, как базовые исходные символы представлены в исходных файлах.

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
CWG 788 C++98 the values of the members of the execution character sets
were implementation-defined, but were not locale-specific
they are locale-specific
CWG 1796 C++98 the representation of the null (wide) character in
basic execution (wide-)character set had all zero bits
only required value to be zero

Смотрите также

Таблица ASCII
Документация C для Наборы символов и кодировки