LINUX.ORG.RU

История изменений

Исправление bonta, (текущая версия) :

В общем L"что-то-там" мой компилятор на x86-64 преобразует в utf-16 кодировку.

Нашел очень легковесную либу, для работы которой нужно всего один хедер подключить (а сама либа в 4 файлах всего идет) http://utfcpp.sourceforge.net

с её помощью я получил то что хотел. Преобразование выглядит так:

wstring toUtf8(const string &str) {
    std::wstring ret;
    vector<wchar_t> utf16;
    utf8::utf8to16(str.begin(), str.end(), back_inserter(utf16));
    ret = std::wstring(utf16.begin(), utf16.end());
    /*if (ret == L"школа") {
        std::wcout << ret << std::endl;
        std::wcout
                << ByteMap( (char*)(&ret.front()), ret.size()*sizeof(wchar_t)) << std::endl;
        std::wstring _nativeWstr = L"школа";
        std::wcout
                << ByteMap( (char*)(&_nativeWstr.front()), _nativeWstr.size()*sizeof(wchar_t)) << std::endl;

    }*/
    return ret;
}

Если убрать комменты то вообще короткое, можно еще проверку на валидность utfкодировки сделать -ну там что правильно все в файле, пользуя эту либу, но это избытоно, ибо к файлам полное доверие.

А еще похоже это и кросплатформенно. В общем всего в пару строк и высокоуровнево, и либа по коду очень короткая и простая.

Исходная версия bonta, :

В общем L"что-то-там" мой компилятор на x86-64 преобразует в utf-16 кодировку.

Нашел очень легковесную либу, для работы которой нужно всего один хедер подключить (а сама либа в 4 файлах всего идет) http://utfcpp.sourceforge.net

с её помощью я получил то что хотел. Преобразование выглядит так:

wstring YAMLParser::toUtf8(const string &str) {
    std::wstring ret;
    vector<wchar_t> utf16;
    utf8::utf8to16(str.begin(), str.end(), back_inserter(utf16));
    ret = std::wstring(utf16.begin(), utf16.end());
    /*if (ret == L"школа") {
        std::wcout << ret << std::endl;
        std::wcout
                << ByteMap( (char*)(&ret.front()), ret.size()*sizeof(wchar_t)) << std::endl;
        std::wstring _nativeWstr = L"школа";
        std::wcout
                << ByteMap( (char*)(&_nativeWstr.front()), _nativeWstr.size()*sizeof(wchar_t)) << std::endl;

    }*/
    return ret;
}

Если убрать комменты то вообще короткое, можно еще проверку на валидность utfкодировки сделать -ну там что правильно все в файле, пользуя эту либу, но это избытоно, ибо к файлам полное доверие.

А еще похоже это и кросплатформенно. В общем всего в пару строк и высокоуровнево, и либа по коду очень короткая и простая.