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

238
20 мая 2017, 19:52

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

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

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

Answer 1

Если кодировка CP1251, то как-то так:

#include <locale>
#include <codecvt>
#include <string>
// "костыль", чтобы наш codecvt имел публичный деструктор,
// как того требует wstring_convert
template<class Facet> 
struct deletable_facet : Facet
{
    template<class ...Args>
    deletable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}
    ~deletable_facet() {}
};
// собственно определяем "конвертер" из узкой в широкую строку и обратно
using convert_type = std::codecvt<wchar_t, char, std::mbstate_t>;
std::wstring_convert<deletable_facet<convert_type>, 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<wchar_t>;
std::wstring_convert<convert_type, wchar_t> converter;

То есть в случае, если вы используете предопределенный codecvt_*, можно опустить использование deletable_facet.

Документация, на которую я ориентировался.

READ ALSO
QApplication::postEvent правильно ли?

QApplication::postEvent правильно ли?

Есть класс наследник QWidget, у которого есть виртуальный метод updateStyle()Данный метод должен срабатывать при получение QEvent::StyleChange и один раз при...

279
GCC для MACOS (Macbook Air)

GCC для MACOS (Macbook Air)

Нужно не большое по весу решение, то есть Хсоde не подойдет, для компиляции С++ кода на MacЕсть какие-нибудь идеи?

379
Изменение размера вектора

Изменение размера вектора

Слышал, что если делать в вектор push_back, то если у него не хватает внутреннего буфера, то он увеличивается в 15 раза

347
Вылет при выполнения + Box2D

Вылет при выполнения + Box2D

При нажатии на кнопку "Старт", в консольке выскакивает ошибка, указывающую на один из заголовочных файлов Box2D, после чего компилятор начинает...

213