Namespaces
Variants

mbrtoc32

From cppreference.net
Определено в заголовочном файле <uchar.h>
size_t mbrtoc32 ( char32_t restrict * pc32, const char * restrict s,
size_t n, mbstate_t * restrict ps ) ;
(начиная с C11)

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

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

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

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

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

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

Содержание

Параметры

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

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

Первое из следующих условий, которое применяется:

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

Пример

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

#include <assert.h>
#include <locale.h>
#include <stdio.h>
#include <uchar.h>
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    char in[] = u8"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
    enum { in_size = sizeof in / sizeof *in };
    printf("Processing %d UTF-8 code units: [", in_size);
    for (int i = 0; i < in_size; ++i)
        printf("%s%02X", i ? " " : "", (unsigned char)in[i]);
    puts("]");
    char32_t out[in_size];
    char32_t* p_out = out;
    char* p_in = in;
    char* end = in + in_size;
    mbstate_t state = {0};
    size_t rc;
    while ((rc = mbrtoc32(p_out, p_in, end - p_in, &state)))
    {
        assert(rc != (size_t)-3); // no surrogate pairs in UTF-32
        if (rc == (size_t)-1) break; // invalid input
        if (rc == (size_t)-2) break; // truncated input
        p_in += rc;
        ++p_out;
    }
    size_t out_size = p_out+1 - out;
    printf("into %zu UTF-32 code units: [", out_size);
    for (size_t i = 0; i < out_size; ++i)
        printf("%s%08X", i ? " " : "", out[i]);
    puts("]");
}

Вывод:

Processing 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]
into 5 UTF-32 code units: [0000007A 000000DF 00006C34 0001F34C 00000000]

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.30.1.5 Функция mbrtoc32 (стр: 410)
  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.28.1.3 Функция mbrtoc32 (стр: 293-294)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.28.1.3 Функция mbrtoc32 (стр: 400-401)

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

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