mbstowcs, mbstowcs_s
From ru.cppreference.net
| Определено в заголовочном файле <stdlib.h>
|
||
size_t mbstowcs( wchar_t* dst, const char* src, size_t len)
|
(1) | (до C99) |
size_t mbstowcs( wchar_t* restrict dst, const char* restrict src, size_t len)
|
(начиная с C99) | |
errno_t mbstowcs_s(size_t* restrict retval, wchar_t* restrict dst,
rsize_t dstsz, const char* restrict src, rsize_t len);
|
(2) | (начиная с C11) |
1) Преобразует строку многобайтовых символов из массива, первый элемент которого указывается указателем
src, в её широкосимвольное представление. Преобразованные символы сохраняются в последовательных элементах массива, на который указывает dst. В целевой массив записывается не более len широких символов. Каждый символ преобразуется так, как если бы был вызван mbtowc, за исключением того, что состояние преобразования mbtowc не изменяется. Преобразование останавливается, если:
- Многобайтовый нулевой символ был преобразован и сохранён.
- Встречен недопустимый (в текущей локали C) многобайтовый символ.
- Следующий широкий символ для сохранения превысил бы
len.
Если
src и dst перекрываются, поведение не определено2) То же, что и (1), за исключением того, что:
- преобразование выполняется как бы с помощью mbrtowc, а не mbtowc
- функция возвращает свой результат через выходной параметр
retval - если после записи
dstшироких символов нулевой символ не был записан вlen, то вL'\0'сохраняетсяdst[len], что означает запись всего len+1 широких символов - если
dstявляется нулевым указателем, количество широких символов, которые были бы созданы, сохраняется в*retval - функция затирает целевой массив от завершающего нуля и до
dstsz - Если
srcиdstперекрываются, поведение не определено. - следующие ошибки обнаруживаются во время выполнения и вызывают текущую установленную функцию обработчика ограничений:
retvalилиsrcявляется нулевым указателемdstszилиlenбольше, чем RSIZE_MAX / sizeof(wchar_t) (если толькоdstне равно null)dstszне равно нулю (если толькоdstне равно null)- В первых
dstszмногобайтовых символах массиваsrcнет нулевого символа, аlenбольше, чемdstsz(если толькоdstне равно null)
- Как и все функции с проверкой границ,
mbstowcs_sгарантированно доступна только если__STDC_LIB_EXT1__определена реализацией и если пользователь определяет__STDC_WANT_LIB_EXT1__как целочисленную константу1до включения <stdlib.h>.
Замечания
В большинстве реализаций mbstowcs обновляет глобальный статический объект типа mbstate_t по мере обработки строки, и не может вызываться одновременно двумя потоками; в таких случаях следует использовать mbsrtowcs.
POSIX определяет распространённое расширение: если dst является нулевым указателем, эта функция возвращает количество широких символов, которые были бы записаны в dst при преобразовании. Аналогичное поведение является стандартным для mbstowcs_s и для mbsrtowcs.
Параметры
| dst | — | указатель на массив широких символов, в который будет сохранена широкая строка |
| src | — | указатель на первый элемент преобразуемой многобайтовой строки, завершающейся нулём |
| len | — | количество широких символов, доступных в массиве, на который указывает dst |
| dstsz | — | максимальное количество широких символов, которое будет записано (размер массива dst)
|
| retval | — | указатель на объект size_t, в который будет сохранён результат |
Возвращаемое значение
1) При успехе возвращает количество широких символов, исключая завершающий
L'\0', записанных в целевой массив. При ошибке преобразования (если встречен недопустимый многобайтовый символ) возвращает (size_t)-1.2) ноль при успехе (в этом случае количество широких символов, исключая завершающий ноль, которые были или были бы записаны в
dst, сохраняется в *retval), ненулевое значение при ошибке. В случае нарушения ограничения времени выполнения сохраняет (size_t)-1 в *retval (если retval не равен null) и устанавливает dst[0] в L'\0' (если dst не равен null или dstmax равен нулю или больше RSIZE_MAX)Пример
Запустить этот код
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
int main(void)
{
setlocale(LC_ALL, "en_US.utf8");
const char* mbstr = u8"z\u00df\u6c34\U0001F34C"; // or u8"zß水🍌"
wchar_t wstr[5];
mbstowcs(wstr, mbstr, 5);
wprintf(L"MB string: %s\n", mbstr);
wprintf(L"Wide string: %ls\n", wstr);
}
Вывод:
MB string: zß水🍌
Wide string: zß水🍌
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.22.8.1 Функция mbstowcs (стр.: TBD)
- K.3.6.5.1 Функция mbstowcs_s (стр.: TBD)
- Стандарт C17 (ISO/IEC 9899:2018):
- 7.22.8.1 Функция mbstowcs (стр.: TBD)
- K.3.6.5.1 Функция mbstowcs_s (стр.: TBD)
- Стандарт C11 (ISO/IEC 9899:2011):
- 7.22.8.1 Функция mbstowcs (стр.: 359)
- K.3.6.5.1 Функция mbstowcs_s (стр.: 611-612)
- Стандарт C99 (ISO/IEC 9899:1999):
- 7.20.8.1 Функция mbstowcs (стр.: 323)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
- 4.10.8.1 Функция mbstowcs
Смотрите также
(C95)(C11) |
преобразует узкую многобайтовую строку в широкую, учитывая состояние (функция) |
(C11) |
преобразует широкую строку в узкую многобайтовую строку (функция) |
Документация C++ по mbstowcs
| |