我看到C ++ 0x将添加对UTF-8,UTF-16和UTF-32文字的支持。但是这三种表述之间的转换呢?
我打算在我的代码中到处使用std :: wstring。但在处理文件和网络时,我还需要操纵UTF-8编码数据。 C ++ 0x是否也支持这些操作?
答案 0 :(得分:15)
在C ++ 0x中,char16_t
和char32_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字符串。
有谁知道怎么做?我应该发布另一个问题吗?