Namespaces
Variants

Null-terminated multibyte strings

From cppreference.net

Нуль-терминированная многобайтовая строка (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 .

Многобайтовая строка символов является совместимой по расположению с null-terminated byte string (NTBS), то есть может храниться, копироваться и анализироваться с использованием тех же средств, за исключением подсчёта количества символов. Если установлена правильная локаль, функции ввода-вывода также работают с многобайтовыми строками. Многобайтовые строки могут быть преобразованы в широкие строки и обратно с использованием следующих зависящих от локали функций преобразования:

Содержание

Функции

Преобразования многобайтовых/широких символов
Определено в заголовочном файле <stdlib.h>
возвращает количество байтов в следующем многобайтовом символе
(функция)
преобразует следующий многобайтовый символ в широкий символ
(функция)
преобразует широкий символ в его многобайтовое представление
(функция)
преобразует строку многобайтовых символов в широкую строку
(функция)
преобразует широкую строку в узкую многобайтовую строку символов
(функция)
Определено в заголовочном файле <wchar.h>
(C95)
проверяет, представляет ли объект mbstate_t начальное состояние сдвига
(функция)
(C95)
преобразует однобайтовый узкий символ в широкий символ, если возможно
(функция)
(C95)
сужает широкий символ до однобайтового узкого символа, если возможно
(функция)
(C95)
возвращает количество байтов в следующем многобайтовом символе, с учетом состояния
(функция)
(C95)
преобразует следующий многобайтовый символ в широкий символ с учетом состояния
(функция)
преобразует широкий символ в его многобайтовое представление с учетом состояния
(функция)
преобразует узкую многобайтовую строку символов в широкую строку с учетом состояния
(функция)
преобразует широкую строку в узкую многобайтовую строку символов с учетом состояния
(функция)
Определено в заголовочном файле <uchar.h>
(C23)
преобразует узкий многобайтовый символ в кодировку UTF-8
(функция)
(C23)
преобразует строку UTF-8 в узкую многобайтовую кодировку
(функция)
преобразует узкий многобайтовый символ в кодировку UTF-16
(функция)
преобразует символ UTF-16 в узкую многобайтовую кодировку
(функция)
преобразует узкий многобайтовый символ в кодировку UTF-32
(функция)
преобразует символ UTF-32 в узкую многобайтовую кодировку
(функция)

Типы

Определено в заголовке <uchar.h>
Определено в заголовке <wchar.h>
информация о состоянии преобразования, необходимая для итерации многобайтовых строк символов
(класс)
Определено в заголовке <uchar.h>
(C23)
8-битный символьный тип
(typedef)
16-битный символьный тип
(typedef)
32-битный символьный тип
(typedef)

Макросы

Определено в заголовочном файле <limits.h>
MB_LEN_MAX
максимальное количество байтов в многобайтовом символе для любой поддерживаемой локали
(макрос-константа)
Определено в заголовочном файле <stdlib.h>
MB_CUR_MAX
максимальное количество байтов в многобайтовом символе в текущей локали
(макрос-переменная)

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.10 Размеры целочисленных типов <limits.h> (стр.: TBD)
  • 7.22 Общие утилиты <stdlib.h> (стр.: TBD)
  • 7.28 Утилиты Юникода <uchar.h> (стр.: TBD)
  • 7.29 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр.: TBD)
  • 7.31.12 Общие утилиты <stdlib.h> (стр.: TBD)
  • 7.31.16 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр.: TBD)
  • K.3.6 Общие утилиты <stdlib.h> (стр.: TBD)
  • K.3.9 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр.: TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.10 Размеры целочисленных типов <limits.h> (стр.: TBD)
  • 7.22 Общие утилиты <stdlib.h> (стр.: TBD)
  • 7.28 Утилиты Юникода <uchar.h> (стр.: TBD)
  • 7.29 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр.: TBD)
  • 7.31.12 Общие утилиты <stdlib.h> (стр.: TBD)
  • 7.31.16 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр.: TBD)
  • K.3.6 Общие утилиты <stdlib.h> (стр.: TBD)
  • K.3.9 Расширенные утилиты многобайтовых и широких символов <wchar.h> (стр.: TBD)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.10 Размеры целочисленных типов <limits.h> (стр. 222)
  • 7.22 Общие утилиты <stdlib.h> (стр. 340-360)
  • 7.28 Утилиты Юникода <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 Limits <float.h> и <limits.h>
  • 4.10 ОБЩИЕ УТИЛИТЫ <stdlib.h>
  • 4.13.7 Общие утилиты <stdlib.h>

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

C++ documentation для Null-terminated multibyte strings