Namespaces
Variants

mbrtoc16

From cppreference.net
Определено в заголовочном файле <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 становится неопределённым.

Пример

В MSVC может потребоваться флаг компилятора /utf-8 для корректной работы UTF_8.

#include <locale.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    const char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    enum { in_sz = sizeof in / sizeof *in };
    printf("Processing %d UTF-8 code units: [", in_sz);
    for (int n = 0; n < in_sz; ++n)
        printf("%s%02X", n ? " " : "", (unsigned char)in[n]);
    puts("]");
    char16_t out[in_sz];
    const char* p_in = in;
    const char* end = in + in_sz;
    char16_t* p_out = out;
    mbstate_t state = {0};
    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("%s%04X", x ? " " : "", out[x]);
    puts("]");
}

Вывод:

Processing 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]
into 6 UTF-16 code units: [007A 00DF 6C34 D83C DF4C 0000]

Ссылки

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

Смотрите также

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