Null-terminated multibyte strings
Нуль-терминированная многобайтовая строка (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>
|
|
|
возвращает количество байтов в следующем многобайтовом символе
(функция) |
|
|
преобразует следующий многобайтовый символ в широкий символ
(функция) |
|
|
(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-битный символьный тип
(typedef) |
|
(C11)
|
16-битный символьный тип
(typedef) |
|
(C11)
|
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
|