std::wcsrtombs
| Определено в заголовочном файле <cwchar>
|
||
std::size_t wcsrtombs( char* dst, const wchar_t** src, std::size_t len, std::mbstate_t* ps ); |
||
Преобразует последовательность широких символов из массива, на первый элемент которого указывает *src, в его узкое многобайтовое представление, которое начинается в состоянии преобразования, описанном *ps. Если dst не равно нулю, преобразованные символы сохраняются в последовательных элементах массива символов, на который указывает dst. В массив назначения записывается не более len байт.
Каждый символ преобразуется так же, как при вызове std::wcrtomb. Преобразование прекращается, если:
- Нулевой символ был преобразован и сохранён. Для
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 << "многобайтовая строка: " << &mbstr[0] << '\n'
<< "Длина, включая '\\0': " << mbstr.size() << '\n';
}
int main()
{
std::setlocale(LC_ALL, "en_US.utf8");
// Узкая многобайтовая кодировка UTF-8
const wchar_t* wstr = L"z\u00df\u6c34\U0001d10b"; // или L"zß水𝄋"
print_wide(wstr);
}
Вывод:
многобайтовая строка: zß水𝄋
Длина, включая '\0': 11
Смотрите также
| преобразует широкий символ в его многобайтовое представление при заданном состоянии (функция) | |
| преобразует узкую многобайтовую строку символов в широкую строку при заданном состоянии (функция) | |
[virtual] |
преобразует строку из internT в externT, например, при записи в файл Оригинал: converts a string from internT to externT, such as when writing to file Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. (virtual protected std::codecvt функция-элемент)
|
Документация C по wcsrtombs
| |