【发布时间】:2019-12-27 09:42:54
【问题描述】:
从this answer 我了解到,在 C++17 中,我们可以通过 std::filesystem::u8path 使用 UTF-8 路径打开 std::fstream。但在 C++20 中,该函数已被弃用,我们应该将 const char8_t* 传递给 std::filesystem::path 构造函数。
问题来了:虽然我们可以合法地转换(通过reinterpret_cast)任何指向const char* 的指针,但我们不能倒转:从const char* 到例如const char8_t*(它会破坏严格的别名规则)。因此,如果我们有一些外部 API 返回文件名的基于 char 的 UTF-8 表示(例如,来自用 C 编写的库),我们不能安全地将指针转换为基于 char8_t 的指针。
那么,我们应该如何将这种基于char 的UTF-8 字符串视图转换为基于char8_t 的视图呢?
【问题讨论】:
-
“我们不能倒退”。你为什么想要? UTF-8 字符串数据应以
char8_t字符串开头。 -
@n.m.不应该意味着它确实如此。在 2020 年之前设计的任何数量的库甚至都不知道
char8_t。 -
旧库可能会继续使用旧 API。已弃用并不意味着已删除。
-
我想我们应该等到标准最终确定并且编译器实现了与
char8_t相关的所有内容。我敢打赌,演员阵容会保存在 MSVC 上,因为据我所知,它没有利用 SAR,并且 gcc&clang 将有一些开关将char8_t视为char以允许别名。 UB 就是 UB,但它与 SAR 和 legacy->new code bridges 是这样的。 -
如果
char[]数据已经以UTF-8 编码,那么只需将memcpy()或std::copy()原样放入char8_t[]缓冲区。