【问题标题】:Extract correct text from a wifstream regardless of encoding无论编码如何,从 wifstream 中提取正确的文本
【发布时间】:2010-02-14 07:37:00
【问题描述】:

这是程序:http://codepad.org/eyxunHot
文件的编码是 UTF-8。

我有一个名为“config.ini”的文本文件,其中包含以下单词: ➑球

如果我使用记事本以“UTF-8”编码保存文件,然后运行程序,根据调试器,八球的值为: âball

如果我使用记事本以“Unicode”编码保存文件,然后运行程序,根据调试器,八球的值为: ÿþ'b

如果我使用记事本以“Unicode big endian”编码保存文件,然后运行程序,根据调试器,八球的值为: þÿ'

在所有这些情况下,结果都是不正确的。 ANSI 编码也不支持 ➑ 符号。无论编码如何,如何确保当我转到 config_file >> Eight_ball 时会从文件中提取单词 ➑ball?无论 config.ini 的编码如何,我都希望这个程序的输出是“程序正确”。

【问题讨论】:

  • 请注意,您的问题根本无法解决。如果我保存内容为“âball”(8 个有效字符)的 Latin-1 文件,则无法将其与包含 ➑ball(5 个有效字符)的 UTF-8 文件区分开来。它们是相同的 8 个字节。

标签: c++ boost encoding utf-8 locale


【解决方案1】:

如果您在 Windows 下并且想要使用 INI 文件,请记住 INI API 支持 Unicode(UTF-16 little endian)INI 文件没有问题,您只需提供带有 BOM 的空文件开始。

顺便说一句,如果您想使用 C++ 流和 Unicode,您可能需要查看 this article。除了 UTF8 之外,您还将了解 C++ 流中的字符转换是如何工作的。

【讨论】:

    【解决方案2】:

    也许您可以使用 ICU 库。

    Windows 在 UTF 支持方面存在许多问题。我的 Ubuntu 使用默认的 UTF-8 编码并解决了这个问题,但是 Unix like OS 对 C++ 标准库有一些奇怪的实现。我的意思是使用 char* 来保存 UTF-8 文本(它在字母上使用 2 个数组单元)。但是使用字符串类它可以清除。

    【讨论】:

      【解决方案3】:

      您需要先设置语言环境,然后 wstreams 才能正常工作。相反,我建议使用常规流和一些库进行字符转换,因为您的输入编码通常会有所不同。目前最好的算法是先尝试读取为 UTF-8,如果失败,尝试读取为 CP1252 或其他用户可配置的旧字符集。

      【讨论】:

      • 您能说得更具体一点吗?我应该使用什么“一些用于字符转换的库”?如果我知道文件是用 UTF-8 编码的,我将如何读取文件?
      • 你可以试试 iconv 库。
      猜你喜欢
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 2012-12-19
      • 2017-07-27
      • 2012-10-10
      • 1970-01-01
      相关资源
      最近更新 更多