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

ext*_*001 5 c++ file ucs2 utf-8 ucs

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

Max*_*iso 1

它们的读取方式取决于您的操作系统支持的内容以及您正在使用的区域设置。

\n\n

如果您只是 na\xc3\xafvely 读取文件而不触及您的区域设置,并且它们的区域设置与您的 std c++ 库正在使用的区域设置不匹配,您可能会遇到困难。单字节字符集与多字节字符集的类似问题。

\n\n

在读取文件之前没有可靠的方法来判断文件的区域设置(元数据可能是错误的),因此一般策略是首先尝试以最常见的格式读取,然后重试如果失败(即遇到无效字符),则使用不同的格式。即使这样,它也可能是模棱两可的。这是一个看似复杂的问题,用疯狂的字符集解析 HTML 时也会遇到同样的问题。

\n\n

一般来说,有两套文件 I/O 函数可用,一套用于多字节字符集,一套用于单字节字符集。不过,对此功能的支持是深度特定于平台的,因此,如果您使用的是未添加特殊字符支持的英语本地化操作系统,则在不使用外部库的情况下,C++ 可能无法直接支持多字节集。

\n\n

Microsoft 指定了 cin 和 cout 的非标准扩展。通过在它们前面加上 aw 前缀,它们可以按字节宽度分隔流。

\n\n
wcout << "\xe5\x84\xab";\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将按您的预期工作,但您必须#define _UNICODE对其进行编译。附带说明一下,Windows 将许多系统 API 调用分为两个版本,一种采用单字节字符串,另一种采用多字节字符串。即CreateProcessAvs CreateProcessW

\n\n

总而言之,IO 功能是根据字符集的字节宽度和区域设置进行划分的。为了给您的问题提供更有针对性的答案,我需要更多地了解您的目标。查看 C++ 的语言环境支持,以便更好地了解这一点。具体来说,区域设置函数在ios_base,imbuegetloc中。目前还没有一个好的方法来处理广泛部署的 C++ 版本中的这些问题,尽管我知道这些问题在即将推出的 C++ 版本中已得到缓解。

\n