rust - 如何将 Windows OsString 转换为 CString?
问题描述
我std::ffi::OsString
在 Windows 上有一个,但我需要将 a 传递std::ffi::CString
给 FFI 函数。有什么方法可以将 转换OsString
为CString
?
我知道在 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())
}
解决方案
在类 Unix 系统上,您可以获取 anOsStr
或viaOsString
的原始字节。您可以将该切片直接传递给.&[u8]
std::os::unix::ffi::OsStrExt::as_bytes
CString::new
在 Windows 上,您无法获取OsStr
or的原始字节OsString
。WTF-8 编码被认为是私有的实现细节。唯一的保证是,如果字符串包含有效的 Unicode,那么可以使用 or 将其转换为恒定时间的str
or 。您还可以使用.String
OsStr::to_str
OsString::into_string
std::os::windows::ffi::OsStrExt::encode_wide
不直接访问原始字节的动机是几乎没有库期望字符串编码为 WTF-8。事实上,有些库甚至可能不期待 UTF-8!(他们可能会期望在当前“ANSI”代码页中编码的字符串。)如果事实证明该库不期望 UTF-8 字符串,则应该将可能格式错误的 UTF-16 字符串转换为期望的编码使用WideCharToMultiByte
.
推荐阅读
- asp.net - Asp.Net 菜单来自 Sql Server“MenuItemClick”事件未触发
- r - R 到 Oracle 连接
- r - 在 R 的 ergm 包中,如果我想模拟具有同质性/聚类的图,我应该输入什么模拟网络?
- video - ffmpeg - 在两次之间向视频添加文本
- solid-principles - 单一责任原则与开闭原则
- javascript - 如何使用 Mailjet 进行身份验证而不会出现与 node_modules 相关的错误?
- laravel - 航海者 Laravel axios 获得 405
- csv - 将 csv 导入 sqlite3 插入失败
- javascript - 如何在 Angular Binding 中编写 Javascript?
- javascript - 使用“this”进行模糊处理后的jQuery焦点