Строки с нулевым завершением и несколькими байтами
Строка с нулевым завершением и несколькими байтами (NTMBS), или «строка с несколькими байтами», представляет собой последовательность ненулевых байтов, за которой следует байт со значением ноль (завершающий нулевой символ).
Каждый символ, хранящийся в строке, может занимать более одного байта. Кодировка, используемая для представления символов в строке с несколькими байтами, зависит от локали: она может быть UTF-8, GB18030, EUC-JP, Shift-JIS и т. д. Например, массив символов {'\xe4','\xbd','\xa0','\xe5','\xa5','\xbd','\0' представляет собой NTMBS, содержащий строку "你好" в кодировке UTF-8 с несколькими байтами: первые три байта кодируют символ 你, следующие три байта кодируют символ 好. Та же строка, закодированная в GB18030, представляет собой массив символов {'\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) | генерирует следующий 16-битный символ с широким символом из узкой многобайтовой строки (функция) |
|
(C11) | преобразует 16-битный символ с широким символом в узкую многобайтовую строку (функция) |
|
(C11) | генерирует следующий 32-битный символ с широким символом из узкой многобайтовой строки (функция) |
|
(C11) | преобразует 32-битный символ с широким символом в узкую многобайтовую строку (функция) |
Типы
Определено в заголовке <wchar.h> |
|
|---|---|
|
(C95) | информация о состоянии преобразования, необходимая для итерации по строкам с несколькими байтами (класс) |
Определено в заголовке <uchar.h> |
|
|
(C23) | тип символа UTF-8, псевдоним для unsigned char (typedef) |
|
(C11) | 16-битный тип символа с широким символом (typedef) |
|
(C11) | 32-битный тип символа с широким символом (typedef) |
Макросы
Определено в заголовке <limits.h> |
|
|---|---|
| MB_LEN_MAX | максимальное количество байтов в многобайтовом символе для любого поддерживаемого языка (макроконстанта) |
Определено в заголовке <stdlib.h> |
|
| MB_CUR_MAX | максимальное количество байтов в многобайтовом символе в текущем языке (макропеременная) |
Ссылки
- Стандарт 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 Пределы <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/w/c/string/multibyte