Spec-Zone.ru › C

Строки с нулевым завершением и несколькими байтами

Строка с нулевым завершением и несколькими байтами (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>
mblen
возвращает количество байтов в следующем символе с несколькими байтами
(функция)
mbtowc
преобразует следующий символ с несколькими байтами в символ с широким символом
(функция)
wctombwctomb_s
(C11)
преобразует символ с широким символом в его представление с несколькими байтами
(функция)
mbstowcsmbstowcs_s
(C11)
преобразует строку с узким многобайтовым символом в строку с широким символом
(функция)
wcstombswcstombs_s
(C11)
преобразует строку с широким символом в строку с узким многобайтовым символом
(функция)
Определено в заголовке <wchar.h>
mbsinit
(C95)
проверяет, представляет ли объект mbstate_t начальное состояние смены состояния
(функция)
btowc
(C95)
расширяет однобайтовый узкий символ до символа с широким символом, если это возможно
(функция)
wctob
(C95)
сужает символ с широким символом до однобайтового узкого символа, если это возможно
(функция)
mbrlen
(C95)
возвращает количество байтов в следующем символе с несколькими байтами, учитывая состояние
(функция)
mbrtowc
(C95)
преобразует следующий символ с несколькими байтами в символ с широким символом, учитывая состояние
(функция)
wcrtombwcrtomb_s
(C95)(C11)
преобразует символ с широким символом в его представление с несколькими байтами, учитывая состояние
(функция)
mbsrtowcsmbsrtowcs_s
(C95)(C11)
преобразует строку с узким многобайтовым символом в строку с широким символом, учитывая состояние
(функция)
wcsrtombswcsrtombs_s
(C95)(C11)
преобразует строку с широким символом в строку с узким многобайтовым символом, учитывая состояние
(функция)
Определено в заголовке <uchar.h>
mbrtoc8
(C23)
преобразует узкий многобайтовый символ в кодировку UTF-8
(функция)
c8rtomb
(C23)
преобразует строку UTF-8 в узкую многобайтовую кодировку
(функция)
mbrtoc16
(C11)
генерирует следующий 16-битный символ с широким символом из узкой многобайтовой строки
(функция)
c16rtomb
(C11)
преобразует 16-битный символ с широким символом в узкую многобайтовую строку
(функция)
mbrtoc32
(C11)
генерирует следующий 32-битный символ с широким символом из узкой многобайтовой строки
(функция)
c32rtomb
(C11)
преобразует 32-битный символ с широким символом в узкую многобайтовую строку
(функция)

Типы

Определено в заголовке <wchar.h>
mbstate_t
(C95)
информация о состоянии преобразования, необходимая для итерации по строкам с несколькими байтами
(класс)
Определено в заголовке <uchar.h>
char8_t
(C23)
тип символа UTF-8, псевдоним для unsigned char
(typedef)
char16_t
(C11)
16-битный тип символа с широким символом
(typedef)
char32_t
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API