2011-09-21 24 views
2

我读过Stroustrup的Appendix D(特别要注意区域设置和的codecvt)。 Stroustrup没有给出一个好的代码和范例(恕我直言)。我一直在试图从互联网上旋转东西,没有任何快乐。我也尝试灌输stringstreams没有成功。字符串转换为wstring的,编码问题

会有人能够显示(和解释)的代码从UTF-8去一个UTF-16(或UTF-32)编码? 注:我不知道输入/输出字符串的大小提前,所以我想到了解决办法应该使用reserveback_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

没有什么可言,指出'wstring'必须是UTF-16(在Unix上,例如,'wchar_t'通常32位的)。因此,这本书没有具体解决UTF-16的问题。此外,由于星体字符,您需要专门处理UTF-16中的代理对,并确保它们正确地转换为4字节的UTF-8序列(反之亦然)。 –

+0

同意Chris(“没有什么说wstring必须是UTF-16”)。我相信唯一需要的是wchar_t至少是8位。对于什么是值得的,我不在乎它的4,8或10个字节 - 我只是想要它转换。 – jww

回答

2

他吸食杂草似乎很明显。至于代码页转换,请看看iconv

+0

我非常接近移动到libiconv。 libiconv不在我的Fedora 14盒子上(尽管它在我的Ubuntu 10盒子上)。我不想通过让用户安装一堆额外的库来折磨用户。 (相反,我在折磨自己......)。 – jww

+2

@noloader:libiconv的功能内置于GNU libc中。所以所有的Linux系统都应该已经有了。 –

4

只需使用UTF8-CPP

std::wstring conversion; 
utf8::utf8to16(utf8_str.begin(), utf8_str.end() , back_inserter(conversion)); 

警告:这只会在哪里工作wchar_t的是2个字节长(窗口)。

对于便携式解决方案,你可以这样做:

std::vector<unsigned short> utf16line; // uint16_t if you can 
utf8::utf8to16(utf8_line.begin(), utf8_line.end(), back_inserter(utf16line)); 

但随后你失去绳支架。希望我们很快就能获得char16_t。

+2

+1:是的,请,这需要使用更多。我见过的用于转换为UTF编码的最佳C++库。 –

+0

Anno - UTFCPP看起来不错。它以我期望的方式缩小(UTF-8)和宽度(UTF- {16 | 32})。但是,它似乎缺少移入/移出当前语言环境和UTF的功能。你可否确认? – jww

+1

是的,不支持其他形式的编码。 – anno