C ++ 0x是否支持将std :: wstring转换为UTF-8字节序列?

时间:2009-03-07 10:25:03

标签: c++ c++11 unicode utf-8 wstring

我看到C ++ 0x将添加对UTF-8,UTF-16和UTF-32文字的支持。但是这三种表述之间的转换呢?

我打算在我的代码中到处使用std :: wstring。但在处理文件和网络时,我还需要操纵UTF-8编码数据。 C ++ 0x是否也支持这些操作?

2 个答案:

答案 0 :(得分:15)

在C ++ 0x中,char16_tchar32_t将用于存储UTF-16和UTF-32,而不是wchar_t

来自草案n2798:

  

22.2.1.4班级模板codecvt

     

2类codecvt用于从一个代码集转换为另一个代码集,例如从宽字符到多字节字符或在宽字符编码(如Unicode)和   EUC。

     

3表76(22.1.1.1.1)所要求的专业化转换实施 -   定义的本机字符集。 codecvt实现了退化   转换;它完全没有转换。专业化codecvt<char16_t, char, mbstate_t>在UTF-16和UTF-8编码方案之间进行转换,并且   专业化codecvt <char32_t, char, mbstate_t>在UTF-32和。之间进行转换   UTF-8编码方案。 codecvt<wchar_t,char,mbstate_t>在本机之间进行转换   窄字符和宽字符的字符集。 mbstate_t的专业化表现   库实现者已知的编码之间的转换。

     

可以通过专门处理用户定义的stateT类型来转换其他编码。 stateT对象可以包含任何与专用do_in或来自通信的有用的状态   do_out成员。

关于wchar_t事物是它不会对使用的编码提供任何保证。它是一种可以保存多字节字符的类型。期。如果您要编写软件,您必须忍受这种妥协。与C ++ 0x兼容的编译器相差甚远。您可以随时尝试VC2010 CTP和g ++编译器。此外,wchar_t在不同平台上具有不同的大小,这是另一个需要注意的事项(VS / Windows上为2个字节,GCC / Mac上为4个字节,依此类推)。然后,GCC的选项如-fshort-wchar使问题进一步复杂化。

因此,最佳解决方案是使用现有库。追逐UNICODE错误不是最好的努力/时间使用。我建议你看看:

更多关于C ++ 0x Unicode字符串文字here

答案 1 :(得分:0)

非常感谢你。我还没有注册,所以我不能直接投票或直接回复评论。

我用codecvt学到了一些东西。我知道您建议的库,以下资源也可能有用http://www.unicode.org/Public/PROGRAMS/CVTUTF/

该项目适用于应该是开源的库。我更希望最小化与外部库的依赖关系。我已经有了libgc和boost的依赖关系,但是后来我只使用了线程。我真的更喜欢坚持使用C ++标准,而且我有点失望,GC支持已经被某种程度上放弃了。

显然VC ++ express 2008支持大多数C ++ 0x标准以及icc。由于我目前使用VC ++开发并且它仍然需要一些时间才能发布库,所以我想尝试使用codecvt和char32_t字符串。

有谁知道怎么做?我应该发布另一个问题吗?