std::wcsrtombs
Определено в заголовочном файле <cwchar> |
||
|---|---|---|
std::size_t wcsrtombs( char* dst,
const wchar_t** src,
std::size_t len,
std::mbstate_t* ps );
|
Преобразует последовательность широких символов из массива, указатель на первый элемент которого передан в *src, в его многобайтовое представление в узком формате, начиная с состояния преобразования, описанного в *ps. Если dst не является нулевым указателем, преобразованные символы сохраняются в последовательных элементах массива символов char, указатель на который передан в dst. В массив назначения записывается не более len байт.
Каждый символ преобразуется так, как если бы вызов std::wcrtomb. Преобразование останавливается, если:
- был преобразован и сохранен символ null.
srcустанавливается в нулевой указатель, а*psпредставляет начальное смещение. - был найден символ
wchar_t, который не соответствует допустимому символу в текущей локали C.srcустанавливается в указатель на первый не преобразованный широкий символ. - следующий многобайтовый символ для записи превысит
len.srcустанавливается в указатель на первый не преобразованный широкий символ. Это условие не проверяется, еслиdstявляется нулевым указателем.
Параметры
| dst | - | указатель на массив узких символов, где будут сохранены многобайтовые символы |
| src | - | указатель на указатель на первый элемент завершаемой нулем широкой строки |
| len | - | количество байт, доступных в массиве, на который указывает dst |
| ps | - | указатель на объект состояния преобразования |
Возвращаемое значение
При успешном выполнении функция возвращает количество байт (включая любые последовательности сдвига, но исключая завершающий '\0') записанных в массив символов, указатель на первый элемент которого передан в dst. Если dst является нулевым указателем, возвращается количество байт, которые были бы записаны (снова, исключая завершающий нулевой символ '\0').
При ошибке преобразования (если встречен недопустимый широкий символ), функция возвращает static_cast<std::size_t>(-1), сохраняет EILSEQ в errno, и оставляет *ps в неопределённом состоянии.
Пример
#include <clocale>
#include <cwchar>
#include <iostream>
#include <string>
#include <vector>
void print_wide(const wchar_t* wstr)
{
std::mbstate_t state = std::mbstate_t();
std::size_t len = 1 + std::wcsrtombs(nullptr, &wstr, 0, &state);
std::vector<char> mbstr(len);
std::wcsrtombs(&mbstr[0], &wstr, mbstr.size(), &state);
std::cout << "multibyte string: " << &mbstr[0] << '\n'
<< "Length, including '\\0': " << mbstr.size() << '\n';
}
int main()
{
std::setlocale(LC_ALL, "en_US.utf8");
// UTF-8 narrow multibyte encoding
const wchar_t* wstr = L"z\u00df\u6c34\U0001d10b"; // or L"zß水𝄋"
print_wide(wstr);
}Вывод:
multibyte string: zß水𝄋 Length, including '\0': 11
См. также
| преобразует широкий символ в его многобайтовое представление, заданное состоянием (функция) |
|
| преобразует строку узких многобайтовых символов в широкую строку, заданную состоянием (функция) |
|
|
[virtual] |
преобразует строку из InternT в ExternT, например, при записи в файл (виртуальная защищенная функция-член std::codecvt<InternT,ExternT,StateT>) |
C документация для wcsrtombs |
|
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/string/multibyte/wcsrtombs