C++:如何将任何文件读入std::string?

5

我有一堆txt文件,想将它们读入std::string中,其中一些是UCS-2、UTF-8编码的。如何将它们读入std::string中?我只想将任何文本文件读入std::string中。我需要转换它们吗?


1
读完后你想对它们做什么? - Jerry Coffin
你想要文件的字节还是字符呢?如果是后者,那么使用什么编码方式呢?这需要你自己来决定。如果你想要字符,可能会有一些问题。 - Cheers and hth. - Alf
好的。我想我得到了字节顺序标记(BOM),但我无法将其内容读入std::string中。如何将任何内容转换为UTF8? - extreme001
1个回答

1

它们的读取方式取决于您的操作系统支持的语言环境。如果您在不更改语言环境的情况下简单地读取文件,而它们的语言环境与您的 std c++ 库使用的语言环境不匹配,则可能会遇到困难。单字节字符集和多字节字符集也存在类似的问题。

在读取文件之前,没有可靠的方法可以确定文件的语言环境(元数据可能是错误的),因此一般策略是首先尝试读取最常见的格式,然后在失败时重新尝试使用不同的格式(即遇到无效字符)。即使这样,仍然可能存在歧义。这是一个非常复杂的问题,解析具有疯狂字符集的 HTML 时也会遇到相同的问题。

通常有两组文件 I/O 函数可用,一组用于多字节字符集,另一组用于单字节字符集。但是,对此功能的支持深度依赖于平台,因此,如果您使用的是未添加特殊字符支持的英文本地化操作系统,则 C++ 可能不直接支持多字节集,除非使用外部库。

Microsoft 指定了 cin 和 cout 的非标准扩展。通过在前面加上 w,它们将流按其字节宽度分开。

wcout << "儫";

这个功能按照你的期望工作,但是你需要在编译时定义#define _UNICODE。值得一提的是,Windows将其许多系统API调用分为两个版本,一个接受单字节字符串,另一个接受多字节字符串。例如,CreateProcessACreateProcessW

因此,IO功能沿着字符集的字节宽度和区域设置进行划分。为了给您更有针对性的答案,我需要了解更多关于您目标的信息。查看C++的区域设置支持,以更好地了解此问题。特别是ios_baseimbuegetloc中的区域设置函数。目前还没有一种良好的方法来处理这些问题,尽管我知道这些问题已经在即将发布的C++版本中得到缓解。


好的。我明白了...但是我该如何将任何内容转换为UTF8?从UCS或其他方式? - extreme001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接