Module std::os::windows::ffi

1.0.0 · source ·
Available on Windows only.
Expand description

特定于 Windows 的 std::ffi 模块中原语的扩展。

Overview

由于历史原因,Windows API 对字符串使用了一种格式可能不正确的 UTF-16 编码。具体来说,Windows 字符串中的 16 位代码单元可能包含 未配对在一起的孤立代理代码点。 Unicode 标准要求代理代码点 (在 U+D800 到 U+DFFF 范围内的代码点) 总是成对的,因为在 UTF-16 编码中,*surrogate code 单元对 * 用于编码单个字符。 为了与不强制执行这些配对的代码兼容,Windows 也不强制执行它们。

虽然不一定总是可以无损地将这样的字符串转换为有效的 UTF-16 字符串 (甚至 UTF-8),但是通常希望能够无损地将这样的字符串往返于 Windows API 之间。 例如,某些 Rust 代码可能与某些 Windows API 一起成为 “bridging”,仅在这些 API 之间传递 WCHAR 字符串,而无需真正研究这些字符串。

如果确实需要 Rust 代码查看这些字符串,则可以通过用 U+FFFD REPLACEMENT CHARACTER 替换无效的序列来将它们转换为有效的 UTF-8,这可能是有损的,就像在其他处理字符串编码的 Rust API 中所做的那样。

OsStringExtOsStrExt

OsString 是 Rust 包装器,用于操作系统首选表示中的拥有所有权的字符串。 在 Windows 上,此结构体通过 OsStringExt trait 的实现得到了增强,该实现具有 OsStringExt::from_wide 方法。这使您可以从 &[u16] 切片创建 OsString。大概是从 WCHAR Windows API 中得到的切片。

同样,OsStr 是 Rust 包装器,用于从操作系统的首选表示形式中借用字符串。在 Windows 上,OsStrExt trait 提供了 OsStrExt::encode_wide 方法,该方法输出 EncodeWide 迭代器。 例如,您可以 collect 这个迭代器,以获得一个 Vec<u16>; 您以后可以获取指向此 vector 内容的指针,并将其提供给 Windows API。

这些 traits 与 OsStringOsStr 一起工作,这样就可以在 Windows 和后面往返字符串,而不会丢失数据,即使字符串是格式错误的 UTF-16。

Structs

  • 为潜在的格式不正确的 UTF-16 生成宽字符序列。

Traits