【问题标题】:Nasty unicode and C++: Easy way to read ASCII/UTF-8/UTF-16 BE/LE text file讨厌的 unicode 和 C++:读取 ASCII/UTF-8/UTF-16 BE/LE 文本文件的简单方法
【发布时间】:2010-01-18 06:45:09
【问题描述】:

对不起,如果这个问题很愚蠢并且已经被问了数千次,但我花了几个小时在谷歌上搜索却找不到答案。

我想读入文本文件,可以是以下任何一种:ASCII/UTF-8/UTF-16 BE/LE 我假设如果文件是 unicode,那么 BOM 总是存在的。

是否有任何自动方式(STL、Boost 或其他方式)使用文件流或任何内容逐行读取文件而不检查 BOM 并始终将 UTF8 放入 std::string?

在这个项目中,我只使用 Windows。知道如何为其他平台解决它也很好。

提前致谢!

【问题讨论】:

    标签: c++ file unicode text


    【解决方案1】:

    【讨论】:

    • 我内心深处希望不要使用额外的库。非常感谢您的快速回复!
    • 你能告诉我如何使用这个库来读取文件吗?我发现只有转换例程,这意味着我需要编写自己的输入处理并要求它手动转换
    • 它实际上不能用于直接读取文件;您需要使用fgets() 之类的东西来读取文本,然后您可以将其放入转换描述符中。
    【解决方案2】:

    BOM 通常不存在于 UTF-8 文件中。因此,在您读取数据并找到不是 ASCII 的字节之前,您无法知道文件是 ASCII 还是 UTF-8。

    此外,当您使用 Windows 时,您是否打算同时处理 ISO-8859-1 和 Windows-1252?后者通常是记事本和写字板等文件的默认设置。在这些情况下,情况会更糟:人们只能通过启发式方式区分此类编码、其他编码和 UTF-8。

    ICU 库有一个character set detection system,您可以使用它来猜测文件的可能字符编码。我不相信iconv有这样的功能。

    ICU 已普遍可用,已安装在 Mac 和 Linux 上,但遗憾的是,没有安装在 Windows 上。这样的例程可能在 Win32 API 中也可用。

    【讨论】:

    • 所有有效的 ASCII 文件也是有效的 UTF-8 文件。
    • 真的!如果他最初的目的就是他所需要的,那么是的,使用 BOM 来检测 UTF-16 变体并且没有 BOM 来假设 UTF-8(或 ASCII)将起作用。但是,在更一般的情况下,在处理文本文件时,那些其他编码会导致失败。
    • 感谢您的好评,但我认为代码页不会是我的问题,因为它们的处理肯定会成为一个麻烦。
    猜你喜欢
    • 1970-01-01
    • 2020-01-29
    • 2023-03-16
    • 2015-07-14
    • 2018-03-08
    • 2014-09-02
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多