【问题标题】:Reading utf-8 files to std::string in C++在 C++ 中将 utf-8 文件读取到 std::string
【发布时间】:2018-01-15 09:58:25
【问题描述】:

终于!我们开始要求我们所有的输入文件都以 utf-8 编码!这是我们一直想做的事情。不幸的是,我们很讨厌它,因为我们都没有尝试过它,而且我们大多数人都是 Windows 程序员,或者习惯了 utf-8 是唯一真正选择的操作系统;两个小组都不知道以与平台无关的方式读取 utf-8 字符串。

所以我们开始研究如何以与平台无关的方式处理 utf-8,发现它非常令人困惑(因为 Windows)以及我在 stackoverflow 上找到的其他问题似乎并没有真正涵盖我们的场景他们令人困惑。我找到了对https://www.codeproject.com/Articles/38242/Reading-UTF-with-C-streams 的引用,我发现它有点令人困惑,并且包含大量绒毛。

所以有一些假设(那一定是真的,否则我们处于 GIGO 状态)

  • 所有文件都采用 utf-8 格式(耶!)
  • std::strings 必须包含 utf-8;不允许转换。
  • 该解决方案必须与区域设置无关,并且适用于 macOS (10.13+)、Windows (10+)、Android 和 iOS 10+。
  • 不需要流支持;我们只处理本地文件(目前),但对流的支持表示赞赏。

如果可以的话,我们会尽量避免使用std::wstring,而且我认为无论如何都没有理由使用它。我们还试图避免使用任何不使用 utf-8 编码的std::string 的第三方库;使用带有重载所有std::string 参数并将所有std::string 参数转换为自定义字符串的函数的自定义字符串是可以接受的。

有没有办法只使用标准 C++ 库来做到这一点?最好仅通过向全局语言环境注入一个方面,该方面告诉流库仅以字符串形式转储文件的内容(像往常一样使用自定义分隔符);不允许转换。

这个问题只是关于将 utf-8 文件读入 std::strings 并将内容存储为 utf-8 编码字符串的问题。处理 Windows API 等是一个单独的问题。

C++17 可用。

【问题讨论】:

  • UTF-8 是一种可变长度的 8 位字节 编码。在当今的大多数系统上,charstd::string 使用)是一个 8 位字节。只要您不期望 length 能够返回它应该按原样工作的代码点数。
  • 这些不是混淆的一部分——Windows 语言环境几乎是唯一的混淆。
  • 那我不是很明白这个问题。您说“这个问题关于将 utf-8 文件读入 std::strings 并将内容存储为 utf-8 编码字符串。”好吧,我的评论几乎回答了这一点。因此,如果这不是“混乱的一部分”,那么这个问题的原因是什么?您在阅读 inot a std::string 时遇到什么问题?你为什么发布这个问题?
  • 我假设您已经熟悉utf8everywhere.com ...?

标签: string encoding utf-8 c++14


【解决方案1】:

UTF-8 只是遵循特定编码的字节序列。如果您将合法 UTF-8 数据的字节序列读入 std::string,则该字符串包含 UTF-8 数据。

要实现这一点,您实际上不需要做什么特别的事情。这与任何其他 C 或 C++ 文件加载一样工作。只是不要乱用 iostream 语言环境,你会没事的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 2013-09-26
    • 2011-11-01
    • 1970-01-01
    相关资源
    最近更新 更多