2

我已经阅读了 Stroustrup 的附录 D(特别注意语言环境和 Codecvt)。Stroustrup 没有给出一个好的编解码器和加宽示例(恕我直言)。我一直在尝试从互联网上调转东西,没有任何乐趣。我也尝试过灌输字符串流但没有成功。

任何人都能够显示(并解释)从 UTF-8 到 UTF-16(或 UTF-32)编码的代码吗?注意:我事先不知道输入/输出字符串的大小,所以我希望解决方案应该使用reserve和一个back_inserter. 请不要使用out.resize(in.length()*2).

完成后,如果代码确实有效,那就太好了(令人惊讶的是那里有多少损坏的代码)。请确保以下“往返”。下面的字节是 UTF-8 和 UTF-{16|32} 中“bone”的汉字。

const std::string n("\xe9\xaa\xa8");
const std::wstring w = L"\u9aa8";

我为一个基本问题道歉。在 Windows 上,我使用 Win32 API,并且在编码之间移动时没有这些问题。

4

2 回答 2

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。

于 2011-09-22T00:57:45.593 回答
2

很明显,他在吸食大麻。至于代码页转换,请看iconv

于 2011-09-21T22:48:38.787 回答