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