close
Пространства имён
Варианты
Действия

std::mbsrtowcs

Материал из cppreference.com
 
 
 
Многобайтовые строки с завершающим нулём
Широкие/многобайтовые преобразования
Типы
 
<tbody> </tbody>
Определено в заголовочном файле <cwchar>
std::size_t mbsrtowcs( wchar_t* dst, const char** src, std::size_t len, std::mbstate_t* ps );

Преобразует многобайтовую последовательность символов с нулевым завершением, которая начинается в состоянии преобразования, описанном *ps, из массива, на первый элемент которого указывает *src, в её представление в расширенных символах. Если dst не равно нулю, преобразованные символы сохраняются в последовательных элементах массива wchar_t, на который указывает dst. В массив назначения записывается не более len широких символов.

Каждый многобайтовый символ преобразуется так же, как при вызове std::mbrtowc. Преобразование прекращается, если:

  • Многобайтовый нулевой символ был преобразован и сохранён. Для src установлен нулевой указатель, а *ps представляет начальное состояние сдвига.
  • Обнаружен недопустимый многобайтовый символ (согласно текущей локали C). src устанавливается на начало первого непреобразованного многобайтового символа.
  • Следующий широкий символ, который нужно сохранить, будет превышать значение len. src устанавливается на начало первого непреобразованного многобайтового символа. Это условие не проверяется, если dst является нулевым указателем.

Параметры

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

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

В случае успеха возвращает количество широких символов, исключая завершающий L'\0', записанный в массив символов. Если dst это нулевой указатель, возвращает количество широких символов, которые были бы записаны при неограниченной длине.

При ошибке преобразования (если обнаружен недопустимый многобайтовый символ) возвращает static_cast<std::size_t>(-1), сохраняет EILSEQ в errno и оставляет *ps в неуказанном состоянии.

Примечание

Эта функция перемещает указатель src в конец преобразованной многобайтовой строки. Этого не происходит, если dst является нулевым указателем.

Пример

#include <clocale>
#include <cwchar>
#include <iostream>
#include <vector>

void print_as_wide(const char* mbstr)
{
    std::mbstate_t state = std::mbstate_t();
    std::size_t len = 1 + std::mbsrtowcs(nullptr, &mbstr, 0, &state);
    std::vector<wchar_t> wstr(len);
    std::mbsrtowcs(&wstr[0], &mbstr, wstr.size(), &state);
    std::wcout << L"Широкая строка: " << &wstr[0] << '\n'
               << L"Длина, включая '\\0': " << wstr.size() << '\n';
}

int main()
{
    std::setlocale(LC_ALL, "en_US.utf8");
    const char* mbstr = "z\u00df\u6c34\U0001f34c"; // или u8"zß水🍌"
    print_as_wide(mbstr);
}

Вывод:

Широкая строка: zß水🍌
Длина, включая '\0': 5

Смотрите также

преобразует следующий многобайтовый символ в широкий символ при заданном состоянии
(функция) [править]
преобразует широкую строку в узкую многобайтовую строку символов при заданном состоянии
(функция) [править]
[virtual]
преобразует строку из externT в internT, например, при чтении из файла
Оригинал:
converts a string from externT to internT, such as when reading from file
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(virtual protected std::codecvt функция-элемент) [править]