gpt4 book ai didi

c++ - 如何在 C++20 中安全地将 const char* 转换为 const char8_t*?

转载 作者:可可西里 更新时间:2023-11-01 18:39:49 30 4
gpt4 key购买 nike

来自 this answer我了解到,在 C++17 中,我们可以通过 std::filesystem::u8path 使用 UTF-8 路径打开 std::fstream。但在 C++20 中,这个函数已被弃用,我们应该将 const char8_t* 传递给 std::filesystem::path 构造函数。

问题来了:虽然我们可以合法地转换(通过reinterpret_cast)任何指向const char*的指针,但我们不能反向操作:from const char* 到例如const char8_t*(它会打破严格的别名规则)。因此,如果我们有一些外部 API 返回文件名的基于 char 的 UTF-8 表示(例如,来自用 C 编写的库),我们就无法安全地将指针转换为 char8_t 基于一个。

那么,我们应该如何将这种基于 char 的 UTF-8 字符串 View 转换为基于 char8_t 的 View ?

最佳答案

免责声明:我是 P0482 的作者引入 char8_t 并弃用 u8path 的提案。

您的观察是正确的;不允许使用 reinterpret_cast 生成指向 char 对象序列的 char8_t 指针。这将在 https://stackoverflow.com/a/57453713/11634221 进一步讨论。 .

尽管 std::filesystem::u8path 已在 C++20 中弃用,但没有计划立即将其移除;你可以继续使用它。此外,P1423纠正了 P0482 中更改的意外后果并允许在 C++20 中使用 charchar8_t 范围调用它。据我所知,没有实现者将 std::filesystem::u8path 注释为已弃用(我不知道是否有任何计划这样做)。

没有(格式良好的)方法可以生成基于 char8_t 指针的 char 序列 View 。可以编写一个范围/迭代器适配器,在内部将单个 char 值转换为迭代器取消引用时的 char8_t。这样的适配器可以满足 C++17 和 C++20 随机访问迭代器对非可变迭代器的要求(它不能满足可变迭代器的要求,因为取消引用操作无法提供左值,也不能满足连续迭代器的要求)。这样的适配器足以调用接受范围的 std::filesystem::path 构造函数。嗯,这可能是一个足够有用的适配器,可以添加到 https://github.com/tahonermann/char8_t-remediation .

查看底层 char 数据的替代方法当然是复制它,但我能理解为什么这样做可能被认为是不可取的(我们已经倾向于进行大量复制使用 std::filesystem::path 时)。

关于c++ - 如何在 C++20 中安全地将 const char* 转换为 const char8_t*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57603013/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com