std::wcsrtombs — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
| Определено в заголовочном файле |
||
|
|
||
Преобразует последовательность широких символов из массива, на первый элемент которого указывает *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
Смотрите также
| преобразует широкий символ в его многобайтовое представление при заданном состоянии (функция) [править] | |
| преобразует узкую многобайтовую строку символов в широкую строку при заданном состоянии (функция) [править] | |
преобразует строку из internT в externT, например, при записи в файл Оригинал: converts a string from internT to externT, such as when writing to file Текст был переведён автоматически используя Переводчик Google. (virtual protected std::codecvt функция-элемент) [править]
| |