Наборы символов и кодировки
На этой странице описаны несколько наборов символов, определённых стандартом 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 | представление нулевого (широкого) символа в базовом наборе символов выполнения (широких символов) состояло только из нулевых битов | требовалось только нулевое значение |
См. также
| Таблица ASCII | |
| Документация по C о наборах символов и кодировках |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/charset