Многобайтовые строки с нулевым завершением
Многобайтовая строка с нулевым завершением (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 допустима, только если она начинается и заканчивается в исходном состоянии сдвига: если использовалась последовательность сдвига, соответствующая ей последовательность возврата должна присутствовать до завершающего нулевого символа. Примерами таких кодировок являются 7-битная JIS, BOCU-1 и SCSU.
Многобайтовая строка символов совместима по размещению со строкой байтов с нулевым завершением (NTBS), то есть может храниться, копироваться и проверяться с помощью тех же средств, за исключением вычисления количества символов. Если используется правильная локаль, функции ввода-вывода также обрабатывают многобайтовые строки. Многобайтовые строки можно преобразовывать в широкие строки и обратно с помощью функций-членов std::codecvt, std::wstring_convert или следующих функций преобразования, зависящих от локали:
Функции
Преобразования многобайтовых и широких символов |
|
Определено в заголовке <cstdlib> |
|
|---|---|
| возвращает количество байтов в следующем многобайтовом символе (функция) |
|
| преобразует следующий многобайтовый символ в широкий символ (функция) |
|
| преобразует широкий символ в его многобайтовое представление (функция) |
|
| преобразует узкую многобайтовую строку символов в широкую строку (функция) |
|
| преобразует широкую строку в узкую многобайтовую строку символов (функция) |
|
Определено в заголовке <cwchar> |
|
| возвращает количество байтов в следующем многобайтовом символе с учетом состояния (функция) |
|
проверяет, представляет ли объект std::mbstate_t исходное состояние сдвига (функция) |
|
| преобразует однобайтовый узкий символ в широкий символ, если это возможно (функция) |
|
| преобразует широкий символ в однобайтовый узкий символ, если это возможно (функция) |
|
| преобразует следующий многобайтовый символ в широкий символ с учетом состояния (функция) |
|
| преобразует широкий символ в его многобайтовое представление с учетом состояния (функция) |
|
| преобразует узкую многобайтовую строку символов в широкую строку с учетом состояния (функция) |
|
| преобразует широкую строку в узкую многобайтовую строку символов с учетом состояния (функция) |
|
Определено в заголовке <cuchar> |
|
|
(C++20) | преобразует узкий многобайтовый символ в кодировку UTF-8 (функция) |
|
(C++20) | преобразует строку UTF-8 в узкую многобайтовую кодировку (функция) |
|
(C++11) | преобразует узкий многобайтовый символ в кодировку UTF-16 (функция) |
|
(C++11) | преобразует символ UTF-16 в узкую многобайтовую кодировку (функция) |
|
(C++11) | преобразует узкий многобайтовый символ в кодировку UTF-32 (функция) |
|
(C++11) | преобразует символ UTF-32 в узкую многобайтовую кодировку (функция) |
Типы
Определено в заголовке <cwchar> |
|
|---|---|
| информация о состоянии преобразования, необходимая для перебора многобайтовых строк символов (класс) |
|
Макросы
Определено в заголовке <climits> |
|
|---|---|
|
MB_LEN_MAX | максимальное количество байтов в многобайтовом символе (константа-макрос) |
Определено в заголовке <cstdlib> |
|
|
MB_CUR_MAX | максимальное количество байтов в многобайтовом символе в текущей локали C (переменная-макрос) |
Определено в заголовке <cuchar> |
|
|
__STDC_UTF_16__
(C++11) | указывает, что mbrtoc16 и c16rtomb используют кодировку UTF-16 (константа-макрос) |
|
__STDC_UTF_32__
(C++11) | указывает, что mbrtoc32 и c32rtomb используют кодировку UTF-32 (константа-макрос) |
См. также
Документация по C для Null-terminated multibyte strings |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/string/multibyte