[英]Getting a boost::filesystem::path as an UTF-8 encoded std::string, on Windows
[英]Interfacing std::filesystem::path with libraries that expect UTF-8 char*?
我希望使用std::filesystem::path
来轻松操作路径,但我使用的库期望在所有平台上使用 UTF-8 编码的const char*
。
我看到我可以得到一个u8string
,但它的c_str()
返回一个char8_t*
。
有什么方法可以让我在所有平台上从filesystem::path
转到 UTF-8 编码的char*
吗?
char8_t
与char
不同的真正原因是确保它的用户知道这不是一个简单的 char,并且需要单独的编码/解码来处理它。 除此之外,它与char
相同。
看起来您正在使用的库无法识别这一点,或者是 C++20 之前的库。 在任何一种情况下,您都可以使用reinterpet_cast
将const char8_t*
为const char*
- 当这种转换合适时,这将是罕见的示例之一。
char8_t
缓冲区可以合理安全地转换为char const*
指针并传递给其他 API。
char8_t
是一种独特的类型,其底层存储与unsigned char
相同。 将unsigned char
位转换为char
是合法的。
char
可能有符号或无符号,因此在可移植代码中摆弄它有点危险。 但是简单地将它(只读)传递给另一个 API 是非常安全的。
通常将一种类型别名为另一种类型在 C++ 中是非法的,但char
是具有特殊别名的类型之一。
请注意,将char
缓冲区直接转换为指向char8_t
的指针是不合法的。 因此,如果它在char
数据中提供 utf-8 序列并且您需要它作为char8_t
缓冲区,则必须将其复制到char8_t
缓冲区(可以通过 memcpy 或类似方法完成)以保持在标准定义的行为范围内.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.