我看到 C++0x 将添加对 UTF-8、UTF-16 和 UTF-32 文字的支持。但是这三种表示之间的转换呢?
我计划在我的代码中到处使用 std::wstring 。但在处理文件和网络时,我还需要处理 UTF-8 编码的数据。C++0x 是否也支持这些操作?
在 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 字符串文字的信息在这里
非常感谢你。我还没有注册,所以我不能直接投票或回复评论。
我从 codecvt 学到了一些东西。我知道您建议的库,以下资源也可能有用http://www.unicode.org/Public/PROGRAMS/CVTUTF/。
该项目用于一个应该是开源的库。我宁愿尽量减少与外部库的依赖关系。我已经对 libgc 和 boost 产生了依赖,但对于后者,我只使用线程。我真的更愿意坚持 C++ 标准,但我有点失望的是,支持的 GC 已经以某种方式被放弃了。
显然,据说 VC++ express 2008 支持大部分 C++0x 标准以及 icc。由于我目前使用 VC++ 进行开发,而且库发布还需要一些时间,所以我想尝试使用 codecvt 和 char32_t 字符串。
有谁知道如何做到这一点 ?我应该发布另一个问题吗?