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 及更高版本,并且由于 Windows 使用 wchar_t 来表示 UTF-16,您可以使用它在 UTF-8 和 Windows 的 native encoding 之间进行转换。
专业化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;