我有一堆 txt 文件,想将它们读入 std::string,其中一些是 UCS-2、UTF-8 编码的。如何将它们读入 std::string。我只想将任何文本文件读入 std::string。我必须转换它们吗?
1 回答
它们的读取方式取决于您的操作系统支持什么以及您使用的语言环境。
如果您只是天真地读入文件而不接触您的语言环境,并且它们的语言环境与您的 std c++ 库正在使用的语言环境不匹配,您可能会遇到困难。单字节和多字节字符集的类似问题。
在读取文件之前没有可靠的方法来判断文件的语言环境(元数据可能是错误的),所以一般的策略是先尝试以最常见的格式读取,然后用不同的格式重新尝试如果失败(即遇到无效字符)。即便如此,它也可能是模棱两可的。这是一个看似复杂的问题,您在解析带有疯狂字符集的 HTML 时遇到了同样的问题。
通常,有两组文件 I/O 函数可用,一组用于多字节字符集,另一组用于单字节字符集。不过,对此功能的支持是特定于平台的,因此,如果您使用的是未添加特殊字符支持的英文本地化操作系统,那么如果不使用外部库,C++ 可能不会直接支持多字节集。
Microsoft 为 cin 和 cout 指定了非标准扩展。通过在它们前面加上 aw,它们按字节宽度分隔流。
wcout << "儫";
这可以按您的预期工作,但您必须#define _UNICODE
编译它。作为旁注,Windows 将其许多系统 API 调用分为两个版本,一个采用单字节字符串,另一个采用多字节字符串。即CreateProcessA
与CreateProcessW
。
总而言之,IO 功能是按照字符集的字节宽度和语言环境来划分的。为了给你一个更有针对性的回答你的问题,我需要更多地了解你的目标。查看 C++ 的语言环境支持以更好地了解这一点。特别是和中ios_base
的语言环境函数。目前还没有很好的方法来处理广泛部署的 C++ 版本的这些问题,尽管我知道这些问题在即将发布的 C++ 版本中得到了缓解。imbue
getloc