wcrtomb, wcrtomb_s
Определено в заголовке <wchar.h> | ||
|---|---|---|
| (1) | ||
size_t wcrtomb( char *s, wchar_t wc, mbstate_t *ps); | (с C95) | |
size_t wcrtomb( char *restrict s, wchar_t wc, mbstate_t *restrict ps); | (с C99) | |
errno_t wcrtomb_s(size_t *restrict retval, char *restrict s, rsize_t ssz,
wchar_t wc, mbstate_t *restrict ps);
| (2) | (с C11) |
Преобразует широкий символ в его узкое многобайтовое представление.
1) Если
s не является указателем на NULL, функция определяет количество байтов, необходимых для хранения многобайтового символьного представления wc (включая любые последовательности смены кода и с учётом текущего состояния преобразования многобайтового символа *ps), и записывает многобайтовое символьное представление в массив символов, первый элемент которого указан в s, обновляя *ps при необходимости. Эта функция может записать не более MB_CUR_MAX байтов.
Если
s является указателем на NULL, вызов эквивалентен wcrtomb(buf, L'\0', ps) для некоторого внутреннего буфера buf.
Если wc — это нулевой широкий символ
L'\0', записывается нулевой байт, перед которым могут находиться необходимые последовательности смены кода для восстановления начального состояния смены кода, а параметр состояния преобразования *ps обновляется для представления начального состояния смены кода.
Если определена макросреда
__STDC_ISO_10646__, значения типа wchar_t — это те же короткие идентификаторы символов, что и в наборе Unicode (обычно кодировка UTF-32); в противном случае это определяется реализацией. В любом случае, кодировка многобайтовых символов, используемая этой функцией, задаётся текущим активным локальным языком C.
2) То же самое, что и (1), за исключением того, что
если
s является указателем на NULL, вызов эквивалентен wcrtomb_s(&retval, buf, sizeof buf, L'\0', ps) с внутренними переменными retval и buf (размер которых больше, чем MB_CUR_MAX)
результат возвращается в параметре-выводе
retval
следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработки ограничений обработчик ограничений:
-
-
retvalилиps— указатель на NULL. -
sszравно нулю или большеRSIZE_MAX(еслиsне равен NULL) -
sszменьше количества байтов, которое должно быть записано (еслиsне равен NULL) -
s— указатель на NULL, ноsszне равен нулю
-
- Как и во всех функциях с проверкой границ,
wcrtomb_sгарантированно доступна только если__STDC_LIB_EXT1__определено реализацией и если пользователь определяет__STDC_WANT_LIB_EXT1__как целую константу1перед включением<wchar.h>.
Параметры
| s | - | указатель на массив узких символов, куда будет записан многобайтовый символ |
| wc | - | широкий символ для преобразования |
| ps | - | указатель на объект состояния преобразования, используемый при интерпретации многобайтовой строки |
| ssz | - | максимальное количество байтов для записи (размер буфера s) |
| retval | - | указатель на параметр-вывод, куда будет записан результат (количество байтов в многобайтовой строке, включая любые последовательности смены кода) |
Возвращаемое значение
1) При успешном выполнении возвращает количество байтов (включая любые последовательности смены кода), записанных в массив символов, первый элемент которого указан в
s.
При ошибке (если
wc не является допустимым широким символом) возвращает (size_t)-1, записывает EILSEQ в errno, и оставляет *ps в неопределённом состоянии.
2) Возвращает ноль при успехе и ненулевое значение при ошибке, в этом случае
s[0] устанавливается в '\0' (если s равен NULL или ssz равно нулю или больше RSIZE_MAX) и *retval устанавливается в (size_t)-1 (если retval не равен NULL).Пример
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>
#include <stdlib.h>
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
mbstate_t state;
memset(&state, 0, sizeof state);
wchar_t in[] = L"zß水🍌"; // or "z\u00df\u6c34\U0001F34C"
size_t in_sz = sizeof in / sizeof *in;
printf("Processing %zu wchar_t units: [ ", in_sz);
for(size_t n = 0; n < in_sz; ++n) printf("%#x ", (unsigned int)in[n]);
puts("]");
char out[MB_CUR_MAX * in_sz];
char *p = out;
for(size_t n = 0; n < in_sz; ++n) {
int rc = wcrtomb(p, in[n], &state);
if(rc == -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 5 wchar_t units: [ 0x7a 0xdf 0x6c34 0x1f34c 0 ] into 11 UTF-8 code units: [ 0x7a 0xc3 0x9f 0xe6 0xb0 0xb4 0xf0 0x9f 0x8d 0x8c 0 ]
Ссылки
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.29.6.3.3 Функция wcrtomb (с. 444)
- K.3.9.3.1.1 Функция wcrtomb_s (с. 647-648)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.24.6.3.3 Функция wcrtomb (с. 390)
См. также
|
(C11) | преобразует широкий символ в его многобайтовое представление (функция) |
|
(C95) | преобразует следующий многобайтовый символ в широкий символ, учитывая состояние (функция) |
Документация C++ для wcrtomb |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/string/multibyte/wcrtomb