Наборы символов и кодировки
Эта страница описывает несколько наборов символов, определённых стандартом C++.
Набор символов переводаНабор символов перевода состоит из следующих элементов:
Набор символов перевода является супермножеством базового набора символов и базового набора символов литералов (см. ниже). | (с 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
|
| 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
|
| U+007B | Левая фигурная скобка |
{ |
| U+007C | Вертикальная черта |
| |
| U+007D | Правая фигурная скобка |
} |
| U+007E | Тильда |
~ |
| Следующие символы добавлены в базовый набор символов с C++26:
| (с 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