【问题标题】:Read entire UTF-8 file into std::string将整个 UTF-8 文件读入 std::string
【发布时间】:2019-04-08 23:07:38
【问题描述】:

我在 ASCII 文件上使用了以下内容:

#include <fstream>
#include <streambuf>
#include <string>
#include <cerrno>

std::string get_file_contents(const char *filename)
{
  std::ifstream in(filename, std::ios::in | std::ios::binary);
  if (in)
  {
    return(std::string((std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>()));
  }
  throw(errno);
}

我想确认它是否适用于 UTF-8 文件以及 std::string 或是否有任何特殊设置?

【问题讨论】:

  • std::string 更多的是字节字符串,而不是 UTF-8 编码单元的字符串。应该可以正常工作。
  • 一个字符串将存储您喜欢的任何编码。棘手的部分是一旦它在那里,你如何处理它。
  • 全部为真,但某些字符串函数使用包含字符编码的语言环境。而且,如果您有一些带有一种字符编码的字符串和一些带有另一种字符编码的字符串,那么祝您好运。也许您有更具体的问题。
  • 相关:What is the best way to read an entire file into a std::string in C++? 有很多不同的方法可以解决这个问题。

标签: c++ unicode fstream


【解决方案1】:

这样读取所有 UTF-8 字符就可以了;毕竟它只是一个字节序列,只有当您进一步处理、转换或输出文本时,您才需要确保考虑到编码。

一个潜在的陷阱是 BOM (https://en.wikipedia.org/wiki/Byte_order_mark)。如果您的文本文件有 BOM,那么您可能需要手动将其从字符串中删除或适当地处理它。应该没有必要将 BOM 与 UTF-8 一起使用,但有些软件可能会这样做来区分编码类型。例如,Windows 上的记事本保存 BOM(让记事本使用 UTF-8 编码保存文件并在二进制编辑器中打开文件以查看)。

【讨论】:

    猜你喜欢
    • 2015-05-14
    • 1970-01-01
    • 2011-02-05
    • 2010-09-12
    相关资源
    最近更新 更多