C++0x 中的 Unicode 支持
我正在尝试在 C++0x 中使用新的 unicode 字符。 所以我编写了示例代码:
#include <fstream>
#include <string>
int main()
{
std::u32string str = U"Hello World";
std::basic_ofstream<char32_t> fout("output.txt");
fout<<str;
return 0;
}
但是在执行该程序后,我得到了空的output.txt 文件。那么为什么它不打印 Hello World 呢?
另外,是否已经为这些类型定义了诸如 cout
和 cin
之类的内容,或者 stdin
和 stdout
没有定义支持统一码吗?
编辑:我正在使用 g++ 和 Linux。
编辑:АТТЕNTION。我发现,标准委员会驳回了 C++0x 中的 Unicode 流。所以以前接受的答案不再正确。有关更多信息,请参阅我的回答!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
Unicode 字符串文字支持从 GCC 4.5 开始。也许这就是问题所在。
[编辑]
经过一番挖掘,我发现这个新的 unicode 文字的流在 N2035 ,它是 包含在标准草案中。根据此文档,您需要 u32ofstream 来输出字符串,但 GCC 4.5 C++0x 库中缺少此类。
作为解决方法,您可以使用普通的 fstream:
这样我就可以在我的 Intel 机器(小端)上以 UTF-32LE 格式输出字符串。
[编辑]
我对
u32ofstream
的状态有点错误:根据C++ 标准委员会 网站 您必须像您一样使用std::basic_ofstream
。此类将使用codecvt
类(请参阅§27.9.1.1 末尾),该类必须在标准库中实现(搜索codecvt 在文档中),但它在 GCC 4.5 中不可用。
Unicode string literals support began in GCC 4.5. Maybe that's the problem.
[edit]
After some digging I've found that streams for this new unicode literals are described in N2035 and it was included in a draft of the standard. According to this document you need
u32ofstream
to output you string but this class is absent in GCC 4.5 C++0x library.As a workaround you can use ordinary fstream:
This way I've output your string in UTF-32LE on my Intel machine (which is little-endian).
[edit]
I was a little bit wrong about the status of
u32ofstream
: according to the latest draft on the The C++ Standards Committee's web site you have to usestd::basic_ofstream<char32_t>
as you did. This class would usecodecvt<char32_t,char,typename traits::state_type>
class (see end of §27.9.1.1) which has to be implemented in the standard library (searchcodecvt<char32_t
in the document), but it's not available in GCC 4.5.在新的 C++ 标准中将不会有 Unicode 流。
正如 @ssmir 提到的,标准委员会将在 C++0x 中添加对 Unicode 的流支持。然而,在功能版本委员会中决定删除对 Unicode 的流支持。有关更多信息,请参阅此链接。
看起来输出 Unicode 字符串的唯一方法是将其转换为 ASCII 字符串 codecvt< /a> .
In new C++ standard there will not be Unicode streams.
As @ssmir mentioned, standard committee was going to add stream support for Unicode in C++0x. However in the feature editions committee decided to remove stream support for Unicode. For more information see this link.
It seams like the only way to output Unicode string is to convert it to ASCII string with codecvt .
创建时,流尝试从全局区域设置获取“codecvt”,但未能获取,因为唯一的标准 codecvt 用于 char 和 wchar_t。
结果,流对象的_M_codecvt成员为NULL。
稍后,在尝试输出期间,您的代码在 basic_ios.h 中的构面检查函数中引发异常(对用户不可见),因为构面是从 _M_codecvt 初始化的。
将一个方面添加到与流关联的本地,以执行从 char32_t 到正确输出的转换。
使用包含正确类型的编解码器的语言环境来填充流。
When creating, the stream tries to obtain a 'codecvt' from the global locale, but fails to get one because the only standard codecvt's are for char and wchar_t.
As a result, _M_codecvt member of the stream object is NULL.
Later, during the attempt to output, your code throws an exception (not visible to user) in facet checking function in basic_ios.h, because the facet is initialized from _M_codecvt.
Add a facet to the local associated with the stream to do the conversion from char32_t to the correct output.
Imbue the stream with a locale containing a codecvt of the right type.