std :: u32string转换为/从std :: string和std :: u16string

我需要在UTF-8,UTF-16和UTF-32之间针对不同的API /模块进行转换,因为我知道可以select使用C ++ 11来查看新的stringtypes。

它看起来像我可以使用UTF-8,UTF-16和UTF-32的stringu16stringu32string 。 我还发现codecvt_utf8codecvt_utf16看起来能够做charchar16_tchar32_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_convertcodecvt_utf8codecvt_utf16codecvt_utf8_utf16 ,那么这些页面会包含一个表格,告诉您可以用于各种UTF转换。

表

是的,你会使用std::wstring_convert来促进各种UTF之间的转换。 尽管它的名字,它不仅限于std::wstring ,它实际上与任何std::basic_string类型(其中std::stringstd::wstringstd::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())); }