【发布时间】:2018-01-15 09:58:25
【问题描述】:
终于!我们开始要求我们所有的输入文件都以 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 格式(耶!)
-
std::strings 必须包含 utf-8;不允许转换。 - 该解决方案必须与区域设置无关,并且适用于 macOS (10.13+)、Windows (10+)、Android 和 iOS 10+。
- 不需要流支持;我们只处理本地文件(目前),但对流的支持表示赞赏。
如果可以的话,我们会尽量避免使用std::wstring,而且我认为无论如何都没有理由使用它。我们还试图避免使用任何不使用 utf-8 编码的std::string 的第三方库;使用带有重载所有std::string 参数并将所有std::string 参数转换为自定义字符串的函数的自定义字符串是可以接受的。
有没有办法只使用标准 C++ 库来做到这一点?最好仅通过向全局语言环境注入一个方面,该方面告诉流库仅以字符串形式转储文件的内容(像往常一样使用自定义分隔符);不允许转换。
这个问题只是关于将 utf-8 文件读入 std::strings 并将内容存储为 utf-8 编码字符串的问题。处理 Windows API 等是一个单独的问题。
C++17 可用。
【问题讨论】:
-
UTF-8 是一种可变长度的 8 位字节 编码。在当今的大多数系统上,
char(std::string使用)是一个 8 位字节。只要您不期望length能够返回它应该按原样工作的代码点数。 -
这些不是混淆的一部分——Windows 语言环境几乎是唯一的混淆。
-
那我不是很明白这个问题。您说“这个问题仅关于将 utf-8 文件读入
std::strings 并将内容存储为 utf-8 编码字符串。”好吧,我的评论几乎回答了这一点。因此,如果这不是“混乱的一部分”,那么这个问题的原因是什么?您在阅读 inot astd::string时遇到什么问题?你为什么发布这个问题? -
我假设您已经熟悉utf8everywhere.com ...?
标签: string encoding utf-8 c++14