c32rtomb
|
Определено в заголовочном файле
<uchar.h>
|
||
| (начиная с C11) | ||
Преобразует отдельную кодовую точку из её представления в виде 32-битного широкого символа переменной длины (обычно UTF-32) в её узкое многобайтовое символьное представление.
Если s не является нулевым указателем, функция определяет количество байт, необходимое для хранения многобайтового представления символа c32 (включая любые сдвиговые последовательности и учитывая текущее состояние многобайтового преобразования * ps ), и сохраняет многобайтовое представление символа в массиве символов, на первый элемент которого указывает s , обновляя * ps при необходимости. Функция может записать не более MB_CUR_MAX байт.
Если s является нулевым указателем, вызов эквивалентен c32rtomb ( buf, U ' \0 ' , ps ) для некоторого внутреннего буфера buf .
Если c32 является нулевым широким символом U ' \0 ' , сохраняется нулевой байт, которому предшествует любая последовательность сдвига, необходимая для восстановления начального состояния сдвига, и параметр состояния преобразования * ps обновляется для представления начального состояния сдвига.
Если макрос __STDC_UTF_32__ определён, 32-битная кодировка, используемая этой функцией, является UTF-32; в противном случае она определяется реализацией. Макрос всегда определён, и кодировка всегда является UTF-32. (начиная с C23) В любом случае, многобайтовая кодировка символов, используемая этой функцией, задаётся текущей активной локалью C.
Содержание |
Параметры
| s | - | указатель на массив узких символов, в который будет сохранён многобайтовый символ |
| c32 | - | 32-битный широкий символ для преобразования |
| ps | - | указатель на объект состояния преобразования, используемый при интерпретации многобайтовой строки |
Возвращаемое значение
При успешном выполнении возвращает количество байтов (включая любые сдвиговые последовательности), записанных в массив символов, на первый элемент которого указывает s . Это значение может быть 0 , например, при обработке ведущих char32_t единиц в многобайтовой последовательности char32_t -единиц (не происходит в UTF-32).
При неудаче (если c32 не является корректным 32-битным широким символом), возвращает - 1 , сохраняет EILSEQ в errno и оставляет * ps в неопределённом состоянии.
Пример
В 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 char32_t in[] = U"zß水🍌"; // or "z\u00df\u6c34\U0001F34C" size_t in_sz = sizeof in / sizeof *in; printf("Processing %zu UTF-32 code units: [", in_sz); for (size_t n = 0; n < in_sz; ++n) printf("%s%08X", 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 = c32rtomb(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 5 UTF-32 code units: [0000007A 000000DF 00006C34 0001F34C 00000000] into 11 UTF-8 code units: [7A C3 9F E6 B0 B4 F0 9F 8D 8C 00]
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
-
- 7.30.1.6 Функция c32rtomb (стр: 411)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.28.1.4 Функция c32rtomb (стр: 401)
Смотрите также
|
(C11)
|
преобразует узкий многобайтовый символ в кодировку UTF-32
(функция) |
|
C++ documentation
для
c32rtomb
|
|