mbrtoc32
|
Определено в заголовочном файле
<uchar.h>
|
||
| (начиная с 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)
Смотрите также
|
(C11)
|
преобразует символ UTF-32 в узкую многобайтовую кодировку
(функция) |
|
C++ documentation
для
mbrtoc32
|
|