Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Конвертация std::string в std::wstring

#cpp #строки


Доброго времени суток. Способов несколько знаю, вот к примеру:

  std::string str("abcdefg");
  std::wstring output(str.begin(), str.end());


Но проблема становится ребром, если в экземпляре класса str используются русские
символы. output создаётся не с теми символами, что были в str. Как победить проблему?
Заранее спасибо.
P.S.: вопрос короткий, не относящийся к главному: под сколько элементов по-умолчанию
выделяет класс vector память. Если использовать его конструктор по-умолчанию? Спасибо.
    


Ответы

Ответ 1



Если кодировка CP1251, то как-то так: #include #include #include // "костыль", чтобы наш codecvt имел публичный деструктор, // как того требует wstring_convert template struct deletable_facet : Facet { template deletable_facet(Args&& ...args) : Facet(std::forward(args)...) {} ~deletable_facet() {} }; // собственно определяем "конвертер" из узкой в широкую строку и обратно using convert_type = std::codecvt; std::wstring_convert, wchar_t> converter; int main() { std::string s = "йцукен"; // string в wstring std::wstring ws = converter.from_bytes(str); // обратное преобразование std::string ss = converter.to_bytes(wstr); } Для UTF-8 нужно только по другому определить convert_type и (опционально) converter: using convert_type = std::codecvt_utf8; std::wstring_convert converter; То есть в случае, если вы используете предопределенный codecvt_*, можно опустить использование deletable_facet. Документация, на которую я ориентировался.

Комментариев нет:

Отправить комментарий