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