c16rtomb
Определено в заголовочном файле <uchar.h> |
||
|---|---|---|
size_t c16rtomb( char* restrict s, char16_t c16, mbstate_t* restrict ps ); |
(с C11) |
Преобразует одиночный код символа из его представления переменной длины 16-битного широкого символа (обычно UTF-16) в его узкое многобайтовое представление.
Если s не является нулевым указателем и c16 является последним 16-битным кодовым блоком в валидном представлении переменной длины кода символа, функция определяет количество байтов, необходимых для хранения многобайтового представления этого кода символа (включая любые последовательности сдвига и учитывая текущее состояние многобайтовой конвертации *ps), и сохраняет многобайтовое представление в массиве символов, первый элемент которого указан s, обновляя *ps при необходимости. Эта функция может записать не более MB_CUR_MAX байтов.
Если s является нулевым указателем, вызов эквивалентен c16rtomb(buf, u'\0', ps) для некоторого внутреннего буфера buf.
Если c16 — это нулевой широкий символ u'\0', сохраняется нулевой байт, перед которым может идти необходимая последовательность сдвига для восстановления начального состояния сдвига, а параметр состояния конвертации *ps обновляется для представления начального состояния сдвига.
Если c16 не является последним кодовым блоком в 16-битном представлении широкого символа, он не записывает в массив, на который указывает s, а только обновляет *ps.
Если макрос __STDC_UTF_16__ определён, то 16-битное кодирование, используемое этой функцией, — UTF-16; в противном случае — определённое реализацией. Макрос всегда определён, и кодирование всегда UTF-16.(с C23) В любом случае, многобайтовое кодирование, используемое этой функцией, задаётся текущим активным языковым окружением C.
Параметры
| s | - | указатель на массив узких символов, куда будет сохранён многобайтовый символ |
| c16 | - | 16-битный широкий символ для преобразования |
| ps | - | указатель на объект состояния преобразования, используемый при интерпретации многобайтовой строки |
Возвращаемое значение
При успешном выполнении функция возвращает количество байтов (включая любые последовательности сдвига), записанных в массив символов, первый элемент которого указан s. Это значение может быть 0, например, при обработке начальных char16_t блоков в много-char16_tблочной последовательности (происходит при обработке ведущего суррогата в паре суррогатов UTF-16).
При ошибке (если c16 не является допустимым 16-битным кодовым блоком) функция возвращает -1, сохраняет EILSEQ в errno и оставляет *ps в неопределённом состоянии.
Примечания
В C11, в отличие от mbrtoc16, которая преобразует многобайтовое кодирование переменной ширины (например, UTF-8) в 16-битное кодирование переменной ширины (например, UTF-16), эта функция может преобразовать только 16-битное кодирование с одним блоком, что означает, что она не может преобразовать UTF-16 в UTF-8, несмотря на то, что это было первоначальным намерением этой функции. Это было исправлено отчётом о дефекте после C11 DR488.
Пример
Примечание: этот пример предполагает, что исправление для отчёта о дефекте DR488 применено
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <uchar.h>
mbstate_t state;
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
const char16_t in[] = u"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
const size_t in_sz = sizeof in / sizeof *in;
printf("Processing %zu UTF-16 code units: [ ", in_sz);
for (size_t n = 0; n < in_sz; ++n)
printf("%#x ", in[n]);
puts("]");
char out[MB_CUR_MAX * in_sz];
char *p = out;
for (size_t n = 0; n < in_sz; ++n)
{
size_t rc = c16rtomb(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("%#x ", +(unsigned char)out[x]);
puts("]");
}Вывод:
Processing 6 UTF-16 code units: [ 0x7a 0xdf 0x6c34 0xd83c 0xdf4c 0 ] into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
Ссылки
- Стандарт C23 (ISO/IEC 9899:2023):
- 7.28.1.2 Функция c16rtomb (с. TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.28.1.2 Функция c16rtomb (с. TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.28.1.2 Функция c16rtomb (с. 399-400)
См. также
|
(C11) |
генерирует следующий 16-битный широкий символ из узкой многобайтовой строки (функция) |
Документация C++ для c16rtomb |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/c16rtomb