我读过Stroustrup的Appendix D(特别注意Locales和Codecvt)。 Stroustrup没有提供良好的codecvt和扩展示例(恕我直言)。我一直试图从互联网上转动东西,没有任何乐趣。我也尝试过使用stringstreams而没有成功。
是否有人能够显示(并解释)从UTF-8到UTF-16(或UTF-32)编码的代码? 注意:我事先并不知道输入/输出字符串的大小,所以我希望解决方案应该使用reserve
和back_inserter
。请不要使用out.resize(in.length()*2)
。
完成后,如果代码实际工作会很棒(令人惊讶的是有多少破解代码)。请确保以下'往返'。下面的字节是UTF-8中的'bone'和UTF- {16 | 32}的Han字符。
const std::string n("\xe9\xaa\xa8");
const std::wstring w = L"\u9aa8";
我对一个基本问题道歉。在Windows上,我使用Win32 API,并且在编码之间没有这些问题。
答案 0 :(得分:4)
只需使用UTF8-CPP:
std::wstring conversion;
utf8::utf8to16(utf8_str.begin(), utf8_str.end() , back_inserter(conversion));
警告:这只适用于wchar_t长度为2个字节(windows)的情况。
对于便携式解决方案,您可以这样做:
std::vector<unsigned short> utf16line; // uint16_t if you can
utf8::utf8to16(utf8_line.begin(), utf8_line.end(), back_inserter(utf16line));
但是你失去了字符串支持。希望我们能尽快得到char16_t。
答案 1 :(得分:2)
他吸食杂草似乎很明显。至于代码页转换,请查看iconv!