Spec-Zone.ru › C++

Наборы символов и кодировки

На этой странице описаны несколько наборов символов, определённых стандартом 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 Коммерческое at @
U+0060 Гравис `
(начиная с C++26)

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

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

Кодовая единица Символ
U+0000 Нулевой символ
U+0007 Звуковой сигнал
U+0008 Забой
U+000D Возврат каретки (CR)

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

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

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

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

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

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

Символ NULL U+0000 кодируется значением 0. Ни один другой элемент набора символов трансляции не кодируется кодовой единицей со значением 0. Значение кодовой единицы каждой десятичной цифры после цифры 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++.

DR Применён к Опубликованное поведение Правильное поведение
CWG 788 C++98 значения элементов наборов символов выполнения определялись реализацией,
но не зависели от локали
они зависят от локали
CWG 1796 C++98 представление нулевого (широкого) символа в базовом наборе символов
выполнения (широких символов) состояло только из нулевых битов
требовалось только нулевое значение

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/charset

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API