C ++ 11 имеет следующие функции:
std::string s = u8"Hello, World!";
// #include <codecvt>
std::wstring_convert<std::codecvt<char16_t,char,std::mbstate_t>,char16_t> convert;
std::u16string u16 = convert.from_bytes(s);
std::string u8 = convert.to_bytes(u16);
Однако, насколько мне известно, единственная реализация, которая пока имеет это, - это libc ++. В C ++ 11 также есть std::codecvt_utf8_utf16<char16_t>
, который есть в некоторых других реализациях. В частности, codecvt_utf8_utf16
работает в VS 2010 и более поздних версиях, и поскольку wchar_t используется Windows для представления UTF-16, вы можете использовать его для преобразования между UTF -8 и собственная кодировка Windows.
Специализация codecvt<char16_t, char, mbstate_t>
преобразует схемы кодирования UTF-16 и UTF-8, а специализация codecvt<char32_t, char, mbstate_t>
преобразует схемы кодирования UTF-32 и UTF-8.
- [locale.codecvt] 22.4.1.4/3
Да, и у специализаций std :: codecvt есть защищенные деструкторы, а wstring_convert требует доступа к деструктору, поэтому вам действительно нужен адаптер:
template <class Facet>
class usable_facet : public Facet {
public:
using Facet::Facet; // inherit constructors
~usable_facet() {}
// workaround for compilers without inheriting constructors:
// template <class ...Args> usable_facet(Args&& ...args) : Facet(std::forward<Args>(args)...) {}
};
template<typename internT, typename externT, typename stateT>
using codecvt = usable_facet<std::codecvt<internT, externT, stateT>>;
std::wstring_convert<codecvt<char16_t,char,std::mbstate_t>> convert;
person
bames53
schedule
18.06.2012