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;