在C ++中将utf-8文件读取到std :: string

时间:2018-01-15 09:58:25

标签: string encoding utf-8 c++14

最后!我们开始要求所有输入文件都以utf-8编码!这是我们一直希望做的事情。不幸的是,我们很沮丧,因为我们都没有尝试过,我们大多数人都是Windows程序员,或习惯于操作系统,其中utf-8是唯一真正的选择;两个小组都不知道如何以平台无关的方式阅读utf-8字符串。

所以我们开始研究如何以平台无关的方式处理utf-8,并发现它非常令人困惑(因为Windows)以及我在stackoverflow上找到的其他问题似乎并没有覆盖我们方案令人困惑。我找到了对https://www.codeproject.com/Articles/38242/Reading-UTF-with-C-streams的引用,我发现它有点令人困惑,并且含有大量的绒毛。

所以有一些假设(必须是真的,或者我们处于GIGO状态)

  • 所有文件都在utf-8(yay!)
  • std::string必须包含utf-8;不允许转换。
  • 该解决方案必须与区域设置无关,并且适用于macOS(10.13 +),Windows(10 +),Android和iOS 10 +。
  • 不需要流支持;我们只处理本地文件(目前),但对流的支持表示赞赏。

我们试图避免使用std::wstring,如果可以的话,我认为没有理由使用它。我们还试图避免使用任何不使用utf-8编码std::string的第三方库;使用带有重载函数的自定义字符串并将所有std::string参数转换为自定义字符串是可以接受的。

有没有办法只使用标准C ++库?最好只是通过使用一个方面来填充全局语言环境,该方面告诉流库只是转换字符串中的文件内容(像往常一样使用自定义分隔符);不允许转换。

此问题关于将utf-8文件读入std::string并将内容存储为utf-8编码字符串。处理Windows API等是一个单独的问题。

C ++ 17可用。

1 个答案:

答案 0 :(得分:1)

UTF-8只是遵循特定编码的字节序列。如果您将合法UTF-8数据的字节序列读入std::string,则该字符串包含UTF-8数据。

要实现这一目标,你真的没什么特别的。这与任何其他C或C ++文件加载一样。只是不要乱用iostream语言环境,你会没事的。