将字符串转换为wstring,编码问题

时间:2011-09-21 22:42:18

标签: c++ string encode wstring

我读过Stroustrup的Appendix D(特别注意Locales和Codecvt)。 Stroustrup没有提供良好的codecvt和扩展示例(恕我直言)。我一直试图从互联网上转动东西,没有任何乐趣。我也尝试过使用stringstreams而没有成功。

是否有人能够显示(并解释)从UTF-8到UTF-16(或UTF-32)编码的代码? 注意:我事先并不知道输入/输出字符串的大小,所以我希望解决方案应该使用reserveback_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,并且在编码之间没有这些问题。

2 个答案:

答案 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