Переносимое преобразование std::string в std::wstring и наоборот?
Мне нужно конвертировать std:: string в std::wstring. Я использовал кое-что в следующих строках Visual Studio 2010 (и это работает нормально):
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
std::string narrow = converter.to_bytes(wide_utf16_source_string);
std::wstring wide = converter.from_bytes(narrow_utf8_source_string);
Тем не менее, когда я строю его на gcc 4.3.4
Дает ошибку:
.cxx:333: error: 'wstring_convert' is not a member of 'std'
.cxx:333: error: 'codecvt_utf8_utf16' is not a member of 'std'
Может кто-нибудь, пожалуйста, предоставьте мне какой-нибудь способ сделать это преобразование независимым от платформы способом.
0 ответов
#include <codecvt>
#include <locale>
// utility wrapper to adapt locale-bound facets for wstring/wbuffer convert
template<class Facet>
struct deletable_facet : Facet
{
template<class ...Args>
deletable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}
~deletable_facet() {}
};
std::string wstr2str(const wchar_t* wstr) {
std::wstring source(wstr);
std::wstring_convert<deletable_facet<std::codecvt<wchar_t, char, std::mbstate_t>>, wchar_t> convert;
std::string dest = convert.to_bytes(source);
return dest;
}
На основе примера https://en.cppreference.com/w/cpp/locale/codecvt.