如何将路径转换为 ​​FFI 的 const char*?

How to convert a Path into a const char* for FFI?

我正在尝试使用代表文件位置的 PathBuf, 并将其传递到 C 库以将图像保存到该位置。

我知道我可以将 PathBuf 变成 OsString, and using std::os::unix::ffi, I can turn it into Vec<u8>, and from there, a CString,但这似乎有些复杂且特定于平台。

这真的是我们目前能做的最好的吗?我宁愿不把它限制在 Unix 上,只是因为像这样小的问题,因为据我所知,其他一切都适用于 Windows。

假设您正在尝试包装 cairo_surface_write_to_png 之类的东西,您最好自己根据 cairo_surface_write_to_png_stream 重新实现它,对文件 IO 使用 Rust。


问题是 Windows 上的路径或多或少是 UTF-16,而且(据我所知)没有 8 位编码( 表示为 const char *),Windows 将接受它可以正确存储所有可能的路径。实际上,如果您对 Windows 上的路径使用 const char *,那您就做错了。

Rust 通过在 Windows 上使用 UTF-16 或 UTF-8 来解决这个问题;相反,它使用 WTF-8 这是 UTF-8 的非标准扩展来编码完整的 UTF-16 space。但是,这也意味着 Windows 上 Rust 路径的实际内部表示在 Rust 本身之外实际上是无用的。