C++11具备此功能:
std::string s = u8"Hello, World!"
//
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>
,其他一些实现也有此功能。具体来说,在VS 2010及以上版本中可以使用codecvt_utf8_utf16
,因为Windows使用wchar_t表示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;
~usable_facet() {}
};
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;