- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
来自 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 中使用 char
和 char8_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/
我是一名优秀的程序员,十分优秀!