Spec-Zone.ru › C

wcsrtombs, wcsrtombs_s

Определено в заголовке <wchar.h>
size_t wcsrtombs( char *dst, const wchar_t **src, size_t len, mbstate_t* ps );
(1) (начиная с C95)
(до C99)
size_t wcsrtombs( char *restrict dst, const wchar_t **restrict src, size_t len,
                  mbstate_t *restrict ps );
(начиная с C99)
errno_t wcsrtombs_s( size_t *restrict retval, char *restrict dst, rsize_t dstsz,
                     const wchar_t **restrict src, rsize_t len,
                     mbstate_t *restrict ps );
(2) (начиная с C11)
1) Преобразует последовательность широких символов из массива, первый элемент которого указывает на *src, в узкое многобайтовое представление, начиная с состояния преобразования, описанного в *ps. Если dst не является null, преобразованные символы сохраняются в последовательных элементах массива char, на который указывает dst. В массив назначения записывается не более len байт. Каждый символ преобразуется так, как если бы был выполнен вызов wcrtomb. Преобразование прекращается, если:
  • Преобразован и сохранён нулевой символ L'\0'. В этом случае записанные байты представляют собой последовательность выхода из режима сдвига (если она необходима), за которой следует '\0'; *src устанавливается в значение нулевого указателя, а *ps представляет исходное состояние сдвига.
  • Обнаружен wchar_t, который не соответствует допустимому символу в текущей локали C. *src устанавливается так, чтобы указывать на первый непреобразованный широкий символ.
  • Запись следующего многобайтового символа превысила бы len. *src устанавливается так, чтобы указывать на первый непреобразованный широкий символ. Это условие не проверяется, если dst является нулевым указателем.
2) То же, что и (1), за исключением того, что
  • функция возвращает результат через выходной параметр retval
  • если преобразование прекращается без записи нулевого символа, функция записывает '\0' в следующий байт в dst, который может быть dst[len] или dst[dstsz] — в зависимости от того, что встретится раньше (то есть всего может быть записано до len+1/dstsz+1 байт). В этом случае перед завершающим нулём может не быть записана последовательность выхода из режима сдвига.
  • функция перезаписывает массив назначения начиная с завершающего нуля и до dstsz
  • Если src и dst перекрываются, поведение не определено.
  • во время выполнения обнаруживаются следующие ошибки, и вызывается установленная в данный момент функция обработчика ограничений:
  • retval, ps, src или *src является нулевым указателем
  • dstsz или len больше RSIZE_MAX (если только dst не является нулевым)
  • dstsz не равен нулю (если только dst не является нулевым)
  • len больше dstsz, а к моменту достижения dstsz преобразование не встретило нулевой символ или ошибку кодирования в массиве src (если только dst не является нулевым)
Как и все функции с проверкой границ, wcsrtombs_s гарантированно доступна только в том случае, если реализация определяет __STDC_LIB_EXT1__, а пользователь задаёт для __STDC_WANT_LIB_EXT1__ целочисленную константу 1 до включения <wchar.h>.

Параметры

dst - указатель на массив узких символов, в который будут записаны многобайтовые символы
src - указатель на указатель на первый элемент широкой строки с завершающим нулевым символом
len - количество байт, доступных в массиве, на который указывает dst
ps - указатель на объект состояния преобразования
dstsz - максимальное количество байт, которые будут записаны (размер массива dst)
retval - указатель на объект size_t, в который будет сохранён результат

Возвращаемое значение

1) В случае успеха возвращает количество байт (включая последовательности сдвига, но не включая завершающий '\0'), записанных в массив символов, на первый элемент которого указывает dst. Если dst является нулевым указателем, возвращает количество байт, которые были бы записаны. При ошибке преобразования (если обнаружен недопустимый широкий символ) возвращает (size_t)-1, сохраняет EILSEQ в errno и оставляет *ps в неопределённом состоянии.
2) В случае успеха возвращает ноль (при этом количество байт без завершающего нуля, которые были или могли быть записаны в dst, сохраняется в *retval); в случае ошибки возвращает ненулевое значение. При нарушении ограничения во время выполнения сохраняет (size_t)-1 в *retval (если только retval не является нулевым) и устанавливает dst[0] в '\0' (если только dst не является нулевым, dstmax не равен нулю и не превышает RSIZE_MAX)

Пример

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <wchar.h>

void print_wide(const wchar_t* wstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len = 1 + wcsrtombs(NULL, &wstr, 0, &state);
    char mbstr[len];
    wcsrtombs(mbstr, &wstr, len, &state);
    printf("Multibyte string: %s\n", mbstr);
    printf("Length, including '\\0': %zu\n", len);
}

int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    print_wide(L"z\u00df\u6c34\U0001f34c"); // or L"zß水🍌"
}

Вывод:

Multibyte string: zß水🍌
Length, including '\0': 11

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.29.6.4.2 Функция wcsrtombs (стр. 324–325)
    • K.3.9.3.2.2 Функция wcsrtombs_s (стр. 471–472)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.29.6.4.2 Функция wcsrtombs (стр. 446)
    • K.3.9.3.2.2 Функция wcsrtombs_s (стр. 649–651)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.24.6.4.2 Функция wcsrtombs (стр. 392)

См. также

wcstombswcstombs_s
(C11)
преобразует широкую строку в узкую многобайтовую строку символов
(функция)
wcrtombwcrtomb_s
(C95)(C11)
преобразует широкий символ в его многобайтовое представление с учётом состояния
(функция)
mbsrtowcsmbsrtowcs_s
(C95)(C11)
преобразует узкую многобайтовую строку символов в широкую строку с учётом состояния
(функция)
Документация C++ для wcsrtombs

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/c/string/multibyte/wcsrtombs

Spec-Zone.ru

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