0

我有一个使用 boost 的 regex_search() 从 html 页面检索的字符串。然而不幸的是,页面中的日文字符被写为 \u 代码,并且这些被 regex_search 解释为字符串中的普通字符。

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

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

最后一点:我在 linux 上运行它,但我肯定会喜欢一个可移植的解决方案,而不是特定于系统的解决方案。

谢谢大家,我真的很感激帮助:D

4

1 回答 1

0

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

你的步骤是:

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

为了说明最后一步:

#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';
}

生成一个文件(在 Linux 上),其中包含e6 97 a5 e6 9c ac e8 aa 9e 0a

于 2013-02-04T23:25:15.033 回答