我需要在UTF-8,UTF-16和UTF-32之间针对不同的API /模块进行转换,因为我知道可以select使用C ++ 11来查看新的stringtypes。
它看起来像我可以使用UTF-8,UTF-16和UTF-32的string
, u16string
和u32string
。 我还发现codecvt_utf8
和codecvt_utf16
看起来能够做char
或char16_t
和char32_t
之间的转换,看起来像一个更高级别的wstring_convert
但似乎只能使用字节/ std::string
wstring_convert
std::string
而不是大量的文档。
我打算为UTF-16 UTF-32和UTF-8 UTF-32情况使用wstring_convert
吗? 我只是真的find了UTF-8到UTF-16的例子,我甚至不能确定在wchar_t
通常被认为是UTF-32的Linux上是正确的…还是直接用这些codecvt做些更复杂的事情呢?
或者这只是还没有真正处于可用状态,我应该坚持我自己现有的小例程使用8,16和32位无符号整数?
如果您在CppReference.com上阅读wstring_convert
, codecvt_utf8
, codecvt_utf16
和codecvt_utf8_utf16
,那么这些页面会包含一个表格,告诉您可以用于各种UTF转换。
是的,你会使用std::wstring_convert
来促进各种UTF之间的转换。 尽管它的名字,它不仅限于std::wstring
,它实际上与任何std::basic_string
类型(其中std::string
, std::wstring
和std::uXXstring
都基于)操作。
类模板std :: wstring_convert使用单独的代码转换方面Codecvt执行字符串
std::string
和宽字符串std::basic_string<Elem>
转换。 std :: wstring_convert假定转换构面的所有权,并且不能使用由区域设置管理的构面。 适用于std :: wstring_convert的标准方面是针对UTF-8 / UCS2和UTF-8 / UCS4转换的std :: codecvt_utf8,以及针对UTF-8 / UTF-16转换的std :: codecvt_utf8_utf16 。
例如:
typedef std::string u8string; u8string To_UTF8(const std::u16string &s) { std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv; return conv.to_bytes(s); } u8string To_UTF8(const std::u32string &s) { std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> conv; return conv.to_bytes(s); } std::u16string To_UTF16(const u8string &s) { std::wstring_convert<std::codecvt_utf8_utf16<char16_t>, char16_t> conv; return conv.from_bytes(s); } std::u16string To_UTF16(const std::u32string &s) { std::wstring_convert<std::codecvt_utf16<char32_t>, char32_t> conv; std::string bytes = conv.to_bytes(s); return std::u16string(reinterpret_cast<const char16_t*>(bytes.c_str()), bytes.length()/sizeof(char16_t)); } std::u32string To_UTF32(const u8string &s) { std::wstring_convert<codecvt_utf8<char32_t>, char32_t> conv; return conv.from_bytes(s); } std::u32string To_UTF32(const std::u16string &s) { const char16_t *pData = s.c_str(); std::wstring_convert<std::codecvt_utf16<char32_t>, char32_t> conv; return conv.from_bytes(reinterpret_cast<const char*>(pData), reinterpret_cast<const char*>(pData+s.length())); }