Spec-Zone.ru › C

c16rtomb

Определено в заголовочном файле <uchar.h>
size_t c16rtomb( char* restrict s, char16_t c16, mbstate_t* restrict ps );
(начиная с C11)

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

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

Если s является нулевым указателем, вызов эквивалентен c16rtomb(buf, u'\0', ps) для некоторого внутреннего буфера buf.

Если c16 — нулевой широкий символ u'\0', сохраняется нулевой байт, которому предшествует любая последовательность переключения состояния, необходимая для восстановления исходного состояния, а параметр состояния преобразования *ps обновляется для представления исходного состояния.

Если c16 не является последней кодовой единицей в 16-битном представлении широкого символа, функция не записывает данные в массив, на который указывает s, а обновляет только *ps.

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

Параметры

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

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

В случае успеха возвращает количество байтов (включая любые последовательности переключения состояния), записанных в массив символов, на первый элемент которого указывает s. Это значение может быть 0, например, при обработке начальных единиц char16_t в последовательности из нескольких единиц char16_t (это происходит при обработке начального суррогата в суррогатной паре UTF-16).

В случае ошибки (если c16 не является допустимой 16-битной кодовой единицей) возвращает -1, сохраняет EILSEQ в errno и оставляет *ps в неопределённом состоянии.

Примечания

В опубликованной редакции C11, в отличие от mbrtoc16, преобразующей многобайтовую кодировку переменной ширины (например, UTF-8) в 16-битную кодировку переменной ширины (например, UTF-16), эта функция может преобразовывать только 16-битную кодировку с единицами фиксированной ширины. Это означает, что она не может преобразовать UTF-16 в UTF-8, несмотря на то, что именно это было изначальной целью создания функции. Ошибка была исправлена в отчёте об обнаруженной ошибке DR488, опубликованном после C11.

Пример

Примечание: в этом примере предполагается, что исправление, указанное в отчёте об обнаруженной ошибке DR488, применено.
В MSVC для корректной работы UTF_8 может потребоваться флаг компилятора /utf-8.

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <uchar.h>

int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char16_t in[] = u"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    const size_t in_sz = sizeof in / sizeof *in;

    printf("Processing %zu UTF-16 code units: [", in_sz);
    for (size_t n = 0; n < in_sz; ++n)
        printf("%s%04X", n ? " " : "", in[n]);
    puts("]");

    char* out = malloc(MB_CUR_MAX * in_sz);
    char* p = out;
    mbstate_t state = {0};

    for (size_t n = 0; n < in_sz; ++n)
    {
        size_t rc = c16rtomb(p, in[n], &state);
        if (rc == (size_t)-1)
            break;
        p += rc;
    }

    size_t out_sz = p - out;
    printf("into %zu UTF-8 code units: [", out_sz);
    for (size_t x = 0; x < out_sz; ++x)
        printf("%s%02X", x ? " " : "", +(unsigned char)out[x]);
    puts("]");
    free(out);
}

Вывод:

Processing 6 UTF-16 code units: [007A 00DF 6C34 D83C DF4C 0000]
into 13 UTF-8 code units: [7A C3 9F E6 B0 B4 ED A0 BC ED BD 8C 00]

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
    • 7.28.1.2 Функция c16rtomb (стр.: уточняется)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.28.1.2 Функция c16rtomb (стр.: уточняется)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.28.1.2 Функция c16rtomb (стр.: 399–400)

См. также

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

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

Spec-Zone.ru

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