2015-04-12 46 views
2

我試圖採取PathBuf代表文件位置, 並將它傳遞到C庫以將圖像保存到該位置。如何將路徑轉換爲FFI的常量字符*?

我可以看到,我可以把PathBufOsString,並使用std::os::unix::ffi,我可以把它變成Vec<u8>,並從那裏,一個CString,但是這似乎有點令人費解和平臺特定的。

這真的是我們現在可以做的最好的嗎?我寧願不要把它限制在Unix上,只要在這個小的問題上,因爲據我所知,其他的一切都在Windows上運行。

+0

對於額外的背景,我試圖用慣用方法來包裝cairo,雖然我真的只是尋找一個通用的答案(因此爲什麼這不是問題的一部分)。 –

+1

Windows上的問題是與Unicode路徑的交互需要通過不同的API。 'char *'僅用於代碼頁。也許你至少可以使用ASCII路徑,但通常在Windows上,「OsString」不是「char *」。這部分是您正在使用的C庫維護者的問題。 – delnan

+0

具體而言,在* nix平臺上,[OsStr是Vec ](https://github.com/rust-lang/rust/blob/a1e3c25a2688664e85052b6205187b62410c0df0/src/libstd/sys/unix/os_str.rs#L24-L26 ),但在Windows上它[是一個Wtf8Buf](https://github.com/rust-lang/rust/blob/a1e3c25a2688664e85052b6205187b62410c0df0/src/libstd/sys/windows/os_str.rs#L23-L25)。 – Shepmaster

回答

1

假設你試圖包裝類似cairo_surface_write_to_png的東西,你可能最好用cairo_surface_write_to_png_stream自己重新實現它,使用Rust作爲文件IO。


問題或多或少在Windows路徑是UTF-16,並有(據我所知),沒有8位編碼(可表示爲const char *),Windows將接受它可以正確存儲所有可能的路徑。實際上,如果您在Windows上使用const char *作爲路徑,那麼您在做錯誤™。

Rust通過在Windows上使用既不使用也不使用 UTF-16或UTF-8;相反,它使用了對UTF-8的非標準擴展WTF-8來編碼完整的UTF-16空間。但是,這也意味着Windows的Rust路徑的實際內部表示在Rust本身之外是無效的。

+0

啊,我明白了,所以我可以使用類似以下示例的內容:http://lists.cairographics.org/archives/cairo/2007-May/010677.html 但只是自己執行寫入調用,我打開的文件使用路徑。 –