C++0x 中的 Unicode 支持

发布于 2024-10-12 03:06:46 字数 694 浏览 6 评论 0 原文

我正在尝试在 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 呢?

另外,是否已经为这些类型定义了诸如 coutcin 之类的内容,或者 stdinstdout 没有定义支持统一码吗?

编辑:我正在使用 g++ 和 Linux。

编辑:АТТЕNTION。我发现,标准委员会驳回了 C++0x 中的 Unicode 流。所以以前接受的答案不再正确。有关更多信息,请参阅我的回答

I'm trying to use new unicode characters in C++0x.
So I wrote sample code:

#include <fstream>
#include <string>
int main()
{
    std::u32string str = U"Hello World";

    std::basic_ofstream<char32_t> fout("output.txt");

    fout<<str;  
    return 0;
}

But after executing this program I'm getting empty output.txt file. So why it's not printing Hello World?

Also is there something like a cout and cin already defined for these types, or stdin and stdout doesn't support Unicode?

Edit: I'm using g++ and Linux.

EDIT:АТТЕNTION. I have discovered, that standard committee dismissed Unicode streams from C++0x. So previously accepted answer is not correct anymore. For more information see my answer!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

玩物 2024-10-19 03:06:46

Unicode 字符串文字支持从 GCC 4.5 开始。也许这就是问题所在。

[编辑]

经过一番挖掘,我发现这个新的 unicode 文字的流在 N2035 ,它是 包含在标准草案中。根据此文档,您需要 u32ofstream 来输出字符串,但 GCC 4.5 C++0x 库中缺少此类。

作为解决方法,您可以使用普通的 fstream:

std::ofstream fout2("output2.txt", std::ios::out | std::ios::binary);
fout2.write((const char *)str.c_str(), str.size() * 4);

这样我就可以在我的 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:

std::ofstream fout2("output2.txt", std::ios::out | std::ios::binary);
fout2.write((const char *)str.c_str(), str.size() * 4);

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 use std::basic_ofstream<char32_t> as you did. This class would use codecvt<char32_t,char,typename traits::state_type> class (see end of §27.9.1.1) which has to be implemented in the standard library (search codecvt<char32_t in the document), but it's not available in GCC 4.5.

很酷不放纵 2024-10-19 03:06:46

在新的 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 .

千と千尋 2024-10-19 03:06:46

创建时,流尝试从全局区域设置获取“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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文