C ++ 0x中的Unicode支持

时间:2011-01-16 09:10:57

标签: c++ unicode stream c++11

我正在尝试在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不支持Unicode吗?

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

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

3 个答案:

答案 0 :(得分:6)

Unicode字符串文字在GCC 4.5中支持began。也许这就是问题。

<强> [编辑]

经过一番挖掘后,我发现这个新的unicode文字的流在N2035中描述,并且在标准的草稿中是included。根据此文档,您需要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 ++标准委员会的latest draft web site,您必须使用std::basic_ofstream<char32_t>。 。该类将使用codecvt<char32_t,char,typename traits::state_type>类(参见§27.9.1.1的结尾),该类必须在标准库中实现(在文档中搜索codecvt<char32_t),但在GCC 4.5中不可用。

答案 1 :(得分:3)

在新的C ++标准中,不会有Unicode流。

正如@ssmir所提到的,标准委员会将在C ++ 0x中添加对Unicode的流支持。但是在功能版本委员会决定删除对Unicode的流支持。有关详细信息,请参阅此link

输出Unicode字符串的唯一方法是使用codecvt将其转换为ASCII字符串。

答案 2 :(得分:1)

创建时,流尝试从全局语言环境中获取“codecvt”,但无法获得一个,因为唯一的标准codecvt用于char和wchar_t。 因此,流对象的_M_codecvt成员为NULL。 稍后,在尝试输出期间,您的代码会在basic_ios.h中的构面检查函数中抛出异常(对用户不可见),因为构面是从_M_codecvt初始化的。

将facet添加到与流关联的本地,以执行从char32_t到正确输出的转换。 使用包含正确类型的codecvt的语言环境对流进行标记。