首页 > 解决方案 > 如何将 Windows OsString 转换为 CString?

问题描述

std::ffi::OsString在 Windows 上有一个,但我需要将 a 传递std::ffi::CString给 FFI 函数。有什么方法可以将 转换OsStringCString

我知道在 Windows 上,OsString它由 WTF-8 编码的缓冲区支持。基本上所有需要发生的就是附加一个 ASCIInul字符并从中创建一个 CString。有什么好的方法吗?如果没有,是否可以直接访问该缓冲区?

这是一些示例代码:

extern "system" fn some_ffi(s: *mut c_char);

fn my_func(os_string: &OsString) {
    let c_string: CString = // ???

    some_ffi(c_string.as_raw())
}

标签: rustffi

解决方案


在类 Unix 系统上,您可以获取 anOsStr或viaOsString的原始字节。您可以将该切片直接传递给.&[u8]std::os::unix::ffi::OsStrExt::as_bytesCString::new

在 Windows 上,您无法获取OsStror的原始字节OsString。WTF-8 编码被认为是私有的实现细节。唯一的保证是,如果字符串包含有效的 Unicode,那么可以使用 or 将其转换为恒定时间的stror 。您还可以使用.StringOsStr::to_strOsString::into_stringstd::os::windows::ffi::OsStrExt::encode_wide

不直接访问原始字节的动机是几乎没有库期望字符串编码为 WTF-8。事实上,有些库甚至可能不期待 UTF-8!(他们可能会期望在当前“ANSI”代码页中编码的字符串。)如果事实证明该库不期望 UTF-8 字符串,则应该将可能格式错误的 UTF-16 字符串转换为期望的编码使用WideCharToMultiByte.


推荐阅读