我有一堆txt文件,想将它们读入std::string中,其中一些是UCS-2、UTF-8编码的。如何将它们读入std::string中?我只想将任何文本文件读入std::string中。我需要转换它们吗?
我有一堆txt文件,想将它们读入std::string中,其中一些是UCS-2、UTF-8编码的。如何将它们读入std::string中?我只想将任何文本文件读入std::string中。我需要转换它们吗?
它们的读取方式取决于您的操作系统支持的语言环境。如果您在不更改语言环境的情况下简单地读取文件,而它们的语言环境与您的 std c++ 库使用的语言环境不匹配,则可能会遇到困难。单字节字符集和多字节字符集也存在类似的问题。
在读取文件之前,没有可靠的方法可以确定文件的语言环境(元数据可能是错误的),因此一般策略是首先尝试读取最常见的格式,然后在失败时重新尝试使用不同的格式(即遇到无效字符)。即使这样,仍然可能存在歧义。这是一个非常复杂的问题,解析具有疯狂字符集的 HTML 时也会遇到相同的问题。
通常有两组文件 I/O 函数可用,一组用于多字节字符集,另一组用于单字节字符集。但是,对此功能的支持深度依赖于平台,因此,如果您使用的是未添加特殊字符支持的英文本地化操作系统,则 C++ 可能不直接支持多字节集,除非使用外部库。
Microsoft 指定了 cin 和 cout 的非标准扩展。通过在前面加上 w,它们将流按其字节宽度分开。
wcout << "儫";
这个功能按照你的期望工作,但是你需要在编译时定义#define _UNICODE
。值得一提的是,Windows将其许多系统API调用分为两个版本,一个接受单字节字符串,另一个接受多字节字符串。例如,CreateProcessA
与CreateProcessW
。
因此,IO功能沿着字符集的字节宽度和区域设置进行划分。为了给您更有针对性的答案,我需要了解更多关于您目标的信息。查看C++的区域设置支持,以更好地了解此问题。特别是ios_base
、imbue
和getloc
中的区域设置函数。目前还没有一种良好的方法来处理这些问题,尽管我知道这些问题已经在即将发布的C++版本中得到缓解。