如何将路径转换为 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 本身之外实际上是无用的。
我正在尝试使用代表文件位置的 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 本身之外实际上是无用的。