Многобайтные строки с нулевым завершением
Многобайтная строка с нулевым завершением (NTMBS), или «многобайтная строка», — это последовательность ненулевых байтов, за которой следует байт со значением ноль (завершающий нулевой символ).
Каждый символ, хранящийся в строке, может занимать более одного байта. Кодировка, используемая для представления символов в многобайтной строке символов, зависит от локали: это может быть UTF-8, GB18030, EUC-JP, Shift-JIS и т. д. Например, массив char {'\xe4','\xbd','\xa0','\xe5','\xa5','\xbd','\0'} — это NTMBS, содержащая строку "你好" в многобайтной кодировке UTF-8: первые три байта кодируют символ 你, следующие три байта кодируют символ 好. Та же строка в кодировке GB18030 представлена массивом char {'\xc4', '\xe3', '\xba', '\xc3', '\0'}, где каждый из двух символов кодируется последовательностью из двух байтов.
В некоторых многобайтных кодировках одна и та же последовательность многобайтных символов может представлять разные символы в зависимости от предшествующих последовательностей байтов, называемых «последовательностями переключения». Такие кодировки называются зависимыми от состояния: для интерпретации каждого символа необходимо знать текущее состояние переключения. NTMBS действительна, только если она начинается и заканчивается в исходном состоянии переключения: если использовалась последовательность переключения, перед завершающим нулевым символом должна присутствовать соответствующая последовательность возврата. Примеры таких кодировок — BOCU-1 и SCSU.
Многобайтная строка символов совместима по размещению с байтовой строкой с нулевым завершением (NTBS), то есть может храниться, копироваться и проверяться с помощью тех же средств, за исключением вычисления количества символов. Если используется подходящая локаль, функции ввода-вывода также обрабатывают многобайтные строки. Многобайтные строки можно преобразовывать в широкие строки и обратно с помощью следующих функций преобразования, зависящих от локали:
Функции
Преобразования многобайтных и широких символов |
|
Определено в заголовочном файле <stdlib.h> |
|
|---|---|
| возвращает количество байтов в следующем многобайтном символе (функция) |
|
| преобразует следующий многобайтный символ в широкий символ (функция) |
|
|
(C11) | преобразует широкий символ в его многобайтовое представление (функция) |
|
(C11) | преобразует узкую многобайтную строку символов в широкую строку (функция) |
|
(C11) | преобразует широкую строку в узкую многобайтную строку символов (функция) |
Определено в заголовочном файле <wchar.h> |
|
|
(C95) | проверяет, представляет ли объект mbstate_t исходное состояние переключения (функция) |
|
(C95) | преобразует однобайтовый узкий символ в широкий символ, если это возможно (функция) |
|
(C95) | преобразует широкий символ в однобайтовый узкий символ, если это возможно (функция) |
|
(C95) | возвращает количество байтов в следующем многобайтном символе с учетом состояния (функция) |
|
(C95) | преобразует следующий многобайтный символ в широкий символ с учетом состояния (функция) |
|
(C95)(C11) | преобразует широкий символ в его многобайтовое представление с учетом состояния (функция) |
|
(C95)(C11) | преобразует узкую многобайтную строку символов в широкую строку с учетом состояния (функция) |
|
(C95)(C11) | преобразует широкую строку в узкую многобайтную строку символов с учетом состояния (функция) |
Определено в заголовочном файле <uchar.h> |
|
|
(C23) | преобразует узкий многобайтный символ в кодировку UTF-8 (функция) |
|
(C23) | преобразует строку UTF-8 в узкую многобайтную кодировку (функция) |
|
(C11) | преобразует узкий многобайтный символ в кодировку UTF-16 (функция) |
|
(C11) | преобразует символ UTF-16 в узкую многобайтную кодировку (функция) |
|
(C11) | преобразует узкий многобайтный символ в кодировку UTF-32 (функция) |
|
(C11) | преобразует символ UTF-32 в узкую многобайтную кодировку (функция) |
Типы
Определено в заголовочном файле <uchar.h> |
|
|---|---|
Определено в заголовочном файле <wchar.h> |
|
|
(C95) | информация о состоянии преобразования, необходимая для перебора многобайтных строк символов (класс) |
Определено в заголовочном файле <uchar.h> |
|
|
(C23) | 8-битный тип символа (определение типа) |
|
(C11) | 16-битный тип символа (определение типа) |
|
(C11) | 32-битный тип символа (определение типа) |
Макросы
Определено в заголовочном файле <limits.h> |
|
|---|---|
|
MB_LEN_MAX | максимальное количество байтов в многобайтном символе для любой поддерживаемой локали (макроконстанта) |
Определено в заголовочном файле <stdlib.h> |
|
|
MB_CUR_MAX | максимальное количество байтов в многобайтном символе в текущей локали (макропеременная) |
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.10 Размеры целочисленных типов <limits.h> (с.: уточняется)
- 7.22 Общие служебные функции <stdlib.h> (с.: уточняется)
- 7.28 Средства работы с Unicode <uchar.h> (с.: уточняется)
- 7.29 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: уточняется)
- 7.31.12 Общие служебные функции <stdlib.h> (с.: уточняется)
- 7.31.16 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: уточняется)
- K.3.6 Общие служебные функции <stdlib.h> (с.: уточняется)
- K.3.9 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: уточняется)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.10 Размеры целочисленных типов <limits.h> (с.: уточняется)
- 7.22 Общие служебные функции <stdlib.h> (с.: уточняется)
- 7.28 Средства работы с Unicode <uchar.h> (с.: уточняется)
- 7.29 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: уточняется)
- 7.31.12 Общие служебные функции <stdlib.h> (с.: уточняется)
- 7.31.16 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: уточняется)
- K.3.6 Общие служебные функции <stdlib.h> (с.: уточняется)
- K.3.9 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: уточняется)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.10 Размеры целочисленных типов <limits.h> (с.: 222)
- 7.22 Общие служебные функции <stdlib.h> (с.: 340–360)
- 7.28 Средства работы с Unicode <uchar.h> (с.: 398–401)
- 7.29 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: 402–446)
- 7.31.12 Общие служебные функции <stdlib.h> (с.: 456)
- 7.31.16 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: 456)
- K.3.6 Общие служебные функции <stdlib.h> (с.: 604–614)
- K.3.9 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: 627–651)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.10 Размеры целочисленных типов <limits.h> (с.: 203)
- 7.20 Общие служебные функции <stdlib.h> (с.: 306–324)
- 7.24 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: 348–392)
- 7.26.10 Общие служебные функции <stdlib.h> (с.: 402)
- 7.26.12 Расширенные средства работы с многобайтными и широкими символами <wchar.h> (с.: 402)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.1.4 Пределы <float.h> и <limits.h>
- 4.10 ОБЩИЕ СЛУЖЕБНЫЕ ФУНКЦИИ <stdlib.h>
- 4.13.7 Общие служебные функции <stdlib.h>
См. также
Документация по C++ для Null-terminated multibyte strings |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/multibyte