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 中所做的那样。
OsStringExt
和 OsStrExt
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 与 OsString
和 OsStr
一起工作,这样就可以在 Windows 和后面往返字符串,而不会丢失数据,即使字符串是格式错误的 UTF-16。
Structs
- 为潜在的格式不正确的 UTF-16 生成宽字符序列。