◐ Shell
clean mode source ↗

Многобайтовые строки с завершающим нулём — cppreference.com

Материал из cppreference.com

Многобайтовая строка с завершающим нулём (NTMBS - null-terminated multibyte string) или просто "многобайтовая строка" это последовательность ненулевых байтов, которая завершается байтом со значением ноль (завершающий нулевой символ).

Каждый символ, хранящийся в строке, может занимать больше одного байта. Кодировка, используемая для представления символов в многобайтовой символьной строке, зависит от локали: это может быть UTF-8, GB18030, EUC-JP, Shift-JIS и т.д. Например, массив символов {'\xe4','\xbd','\xa0','\xe5','\xa5','\xbd','\0'} представляет собой NTMBS, содержащую строку "你好" в многобайтовой кодировке UTF-8: первые три байта кодируют символ 好, следующие три байта кодируют символ 好. Та же строка, закодированная в GB18030 представляет собой массив символов {'\xc4', '\xe3', '\xba', '\xc3', '\0'}, где каждый из двух символов закодирован как двухбайтовая последовательность.

В некоторых многобайтовых кодировках любая заданная последовательность многобайтовых символов может представлять собой разные символы в зависимости от предыдущих байтовых последовательностей, известных как "сдвиг последовательностей". Такие кодировки больше известны как зависимые от состояния: для интерпретации каждого символа требуется знание текущего состояния сдвига. NTMBS действительна только в том случае, если она начинается и заканчивается в начальном состоянии сдвига: если использовался сдвиг последовательности, должен присутствовать соответствующий обратный сдвиг последовательности перед завершающим нулевым символом. Примерами таких кодировок являются 7-битная JIS, BOCU-1 и SCSU.

Многобайтовая символьная строка структурно-совместима с байтовой строкой с завершающим нулём (NTBS - null-terminated byte string), то есть может храниться, копироваться и проверяться с использованием тех же средств, за исключением вычисления количества символов. Если выбрана корректная локаль, функции Ввода/Вывода также обрабатывают многобайтовые строки. Многобайтовые строки могут быть преобразованы в широкие строки и наоборот с помощью функций-элементов 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)

преобразует 16-битный символ в узкую многобайтовую строку
(функция) [править]

(C++11)

преобразует узкий многобайтовый символ в кодировку UTF-32
(функция) [править]

(C++11)

преобразует 32-битный символ в узкую многобайтовую строку
(функция) [править]

Типы

Определены в заголовочном файле <cwchar>

информация о состоянии преобразования, необходимая для итерации многобайтовых символьных строк
(класс) [править]

Макросы

Определены в заголовочном файле <climits>

MB_LEN_MAX

максимальное количество байтов в многобайтовом символе
(макроконстанта) [править]

Определены в заголовочном файле <cstdlib>

MB_CUR_MAX

максимальное количество байтов в многобайтовом символе в текущей локали C
(макропеременная) [править]

Определены в заголовочном файле <cuchar>

__STDC_UTF_16__

(C++11)

указывает, что кодировка UTF-16 используется mbrtoc16 и c16rtomb
(макроконстанта)

__STDC_UTF_32__

(C++11)

указывает, что кодировка UTF-32 используется mbrtoc32 и c32rtomb
(макроконстанта)

Смотрите также