将“\\ u1234”转换为“\ u1234”

时间:2013-02-04 07:14:52

标签: boost unicode utf-8 fstream

我有一个字符串,我使用boost的regex_search()从html页面重新获得。不幸的是,页面中的日文字符被写为\ u代码,regex_search将这些字符解释为字符串中的普通字符。

所以,我的问题是,如何将这些代码转换为普通的Unicode文本? (显然是UTF-8)

这是一个基本问题,fstream完全不考虑UTF-8。看起来boost有自己的fstream实现,但改为它对我的程序没有任何影响,我找不到任何额外的设置来配置boost的fstream来使用UTF-8(虽然今天是我工作的第一天有了提升,我本可以错过它。)

作为最后一点:我在linux上运行它,但我当然很欣赏一种基于系统的便携式解决方案。

谢谢大家,我非常感谢帮助:D

1 个答案:

答案 0 :(得分:0)

fstream是一个仅限字符的窄流(它是basic_fstream<char>的typedef)。 std::wfstream将是您正在寻找的类型,虽然要完全可移植到Windows,但您可能必须引入C ++ 11依赖项(Windows没有Unicode语言环境,但支持与语言环境无关的Unicode C ++ 11引入的转换.Linux上的GCC不支持新的Unicode转换,但有大量的Unicode语言环境可供选择)或依赖于boost.locale。

您的步骤将是:

  1. 解析字符串以获取代码点的十六进制值
  2. 将它们存储为宽字符。
  3. 将它们写入std::wofstream(或首先转换为UTF-8,然后写入std::ofstream
  4. 说明最后一步:

    #include <fstream>
    #include <locale>
    int main()
    {
        std::locale::global(std::locale("en_US.utf8")); // any utf8 works
        std::wofstream f("test.txt");
        f.imbue(std::locale());
    
        f << wchar_t(0x65e5) << wchar_t(0x672c) << wchar_t(0x8a9e) << '\n';
    }
    

    生成一个包含e6 97 a5 e6 9c ac e8 aa 9e 0a

    的文件(在Linux上)