Spec-Zone.ru › C

mbsrtowcs, mbsrtowcs_s

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

Параметры

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

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

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

Пример

#include <stdio.h>
#include <locale.h>
#include <wchar.h>
#include <string.h>
 
void print_as_wide(const char* mbstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof state);
    size_t len = 1 + mbsrtowcs(NULL, &mbstr, 0, &state);
    wchar_t wstr[len];
    mbsrtowcs(&wstr[0], &mbstr, len, &state);
    wprintf(L"Wide string: %ls \n", wstr);
    wprintf(L"The length, including L'\\0': %zu\n", len);
}
 
int main(void)
{
    setlocale(LC_ALL, "en_US.utf8");
    print_as_wide(u8"z\u00df\u6c34\U0001f34c"); // u8"zß水🍌"
}

Вывод:

Wide string: zß水🍌
The length, including L'\0': 5

Ссылки

  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.29.6.4.1 Функция mbsrtowcs (с. 445)
    • K.3.9.3.2.1 Функция mbsrtowcs_s (с. 648-649)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.24.6.4.1 Функция mbsrtowcs (с. 391)

См. также

mbstowcsmbstowcs_s
(C11)
Преобразует строку многобайтовых символов в строку широких символов
(функция)
mbrtowc
(C95)
Преобразует следующий многобайтовый символ в широкий символ, учитывая состояние
(функция)
wcsrtombswcsrtombs_s
(C95)(C11)
Преобразует строку широких символов в строку многобайтовых символов, учитывая состояние
(функция)
Документация C++ для mbsrtowcs

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

Spec-Zone.ru

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