Spec-Zone.ru › C

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)

См. также

wctombwctomb_s
(C11)
преобразует широкий символ в его многобайтовое представление
(функция)
mbrtowc
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API