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 Коммерческий символ @ @
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 представление нулевого (расширенного) символа в
базовом наборе символов выполнения (расширенном) имело все нулевые биты
требуется только значение 0

См. также

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

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

Spec-Zone.ru

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