Spec-Zone.ru › C

mbrtoc16

Определено в заголовке <uchar.h>
size_t mbrtoc16( char16_t* restrict pc16, const char* restrict s,
                 size_t n, mbstate_t* restrict ps );
(с C11)

Преобразует одиночный код символа из его узкого многобайтового представления в его 16-битное широкое представление переменной длины (как правило, UTF-16).

Если s не является нулевым указателем, проверяет не более n байтов строки многобайтовых символов, начиная с байта, на который указывает s, чтобы определить количество байтов, необходимое для завершения следующего многобайтового символа (включая все последовательности смены и с учётом текущего состояния преобразования многобайтовых символов *ps). Если функция определяет, что следующий многобайтовый символ в s завершён и корректен, преобразует его в соответствующий 16-битный широкий символ и сохраняет его в *pc16 (если pc16 не равен нулю).

Если многобайтовый символ в *s соответствует последовательности нескольких символов типа char16_t (например, паре суррогатов в UTF-16), то после первого вызова этой функции *ps обновляется таким образом, что следующий вызов mbrtoc16 запишет дополнительные char16_t, не учитывая *s.

Если s является нулевым указателем, значения n и pc16 игнорируются, и вызов эквивалентен mbrtoc16(NULL, "", 1, ps).

Если полученный широкий символ — нулевой символ, состояние преобразования *ps представляет собой начальное состояние смены.

Если макрос __STDC_UTF_16__ определён, 16-битный код, используемый этой функцией, — UTF-16; в противном случае — определяется реализацией. Макрос всегда определён, и кодировка всегда UTF-16.(с C23) В любом случае, многобайтовая кодировка символов, используемая этой функцией, определяется текущим активным языковым окружением C.

Параметры

pc16 - указатель на место, куда будет записан получившийся 16-битный широкий символ
s - указатель на строку многобайтовых символов, используемую в качестве входных данных
n - ограничение на количество байтов в s, которые могут быть проверены
ps - указатель на объект состояния преобразования, используемый при интерпретации строки многобайтовых символов

Возвращаемое значение

Первое из следующего, что применимо:

  • ​0​ если символ, преобразованный из s (и сохранённый в *pc16 при не нулевом значении), был нулевым символом
  • количество байтов [1...n] многобайтового символа, успешно преобразованного из s
  • (size_t)-3 если следующий char16_t из многосимвольного char16_t символа (например, пары суррогатов) теперь записан в *pc16. В этом случае из входных данных не обрабатываются байты.
  • (size_t)-2 если следующие n байта составляют незавершенный, но до сих пор корректный, многобайтовый символ. В *pc16 ничего не записывается.
  • (size_t)-1 если произошла ошибка кодирования. В *pc16 ничего не записывается, значение EILSEQ сохраняется в errno, и значение *ps не определено.

Пример

#include <locale.h>
#include <stdio.h>
#include <uchar.h>
 
mbstate_t state;
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    const size_t in_sz = sizeof in / sizeof *in;
 
    printf("Processing %zu UTF-8 code units: [ ", in_sz);
    for (size_t n = 0; n < in_sz; ++n)
        printf("%#x ", (unsigned char)in[n]);
    puts("]");
 
    char16_t out[in_sz];
    const char *p_in = in, *end = in + in_sz;
    char16_t *p_out = out;
    for (size_t rc; (rc = mbrtoc16(p_out, p_in, end - p_in, &state));)
    {
        if (rc == (size_t)-1)     // invalid input
            break;
        else if(rc == (size_t)-2) // truncated input
            break;
        else if(rc == (size_t)-3) // UTF-16 high surrogate
            p_out += 1;
        else
        {
            p_in += rc;
            p_out += 1;
        };
    }
 
    const size_t out_sz = p_out - out + 1;
    printf("into %zu UTF-16 code units: [ ", out_sz);
    for (size_t x = 0; x < out_sz; ++x)
        printf("%#x ", out[x]);
    puts("]");
}

Вывод:

Processing 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
into 6 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c 0 ]

Справочные материалы

  • Стандарт C23 (ISO/IEC 9899:2023):
    • 7.30.1.3 Функция mbrtoc16 (стр. 408-409)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.28.1.1 Функция mbrtoc16 (стр. 398-399)

См. также

c16rtomb
(C11)
преобразует 16-битный широкий символ в узкую многобайтовую строку
(функция)
Документация C++ для mbrtoc16

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/mbrtoc16

Spec-Zone.ru

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