从这个答案中,我了解到在C ++ 17中,我们可以std::fstream通过使用UTF-8路径打开std::filesystem::u8path。但是在C ++ 20中,不建议使用此函数,而应该将其传递const char8_t*给std::filesystem::path构造函数。
问题来了:尽管我们可以合法地(通过reinterpret_cast)将任何指针转换为const char*,但我们不能向后做:from const char*到eg const char8_t*(这会破坏严格的别名规则)。因此,如果我们有一些外部API返回char文件名的基于UTF-8的表示形式(例如,使用C语言编写的库),则无法安全地将指针转换为char8_t基于文件的指针。
那么,我们应该如何将这种char基于UTF-8字符串char8_t的视图转换为基于它们的UTF-8字符串?
还有 char8_t呢?
我假设某个地方有一些C ++ 20决策,但我找不到。还有P1428,但DOC不提任何东西printf()家庭VS char8_t *或char8_t。
使用std::cout建议可能是一个答案。不幸的是,它不再编译了。
// does not compile under C++20
// error : overload resolution selected deleted operator '<<'
// see P1423, proposal 7
std::cout << u8"A2";
std::cout << char8_t ('A');
Run Code Online (Sandbox Code Playgroud)
对于C 2.x和char8_t
请从这里开始。
更新资料
我用u8序列中的单个元素做了更多测试。这确实是行不通的。char8_t *要printf("%s")工作,但char8_t到printf("%c")是等待发生的事故。
请参阅-https ://wandbox.org/permlink/6NQtkKeZ9JUFw4Sd-根据当前现状,问题char8_t尚未实现char8_t *。-让我重复一遍:没有实现的类型可以保存char8_t *序列中的单个元素。
如果您想要单个u8字形,则需要将其编码为u8字符串
char8_t const * single_glyph = u8"?";
Run Code Online (Sandbox Code Playgroud)
而且目前看来,打印上述一种肯定的方法是 …