我正在尝试将原始操作系统文件名保存到存储中,因此我需要获取 OsStr
的原始字节。
似乎可以调用as_bytes()
在 *nix 平台上,但未在 MS Windows 上定义。
是否有一种可移植的方法将OsStr
转换为字节?
最佳答案
点OsStr
是它的表示是特定于操作系统的。由于技术原因,实现有些复杂(@Shepmaster's answer 提供了更多细节),但您可以这样想:
- 在 POSIX 系统上,
OsStr
归结为&[u8]
, 因为 POSIX 函数接受并返回字节串; - 在 Windows 上,
OsStr
可以被认为是一个&[u16]
,因为 Win32 Unicode 函数接受并返回字符串作为 16 位单元的数组。
由于 native Windows API 接受 16 位“宽字符”1 序列,这就是 OsStr
旨在存储。虽然 OsStr
可以转换为字节,因为任何东西都可以转换为字节,这样的表示是没有用的,因为这些字节对用户和系统都没有意义。这就是为什么 OsStr
不提供在 Windows 上以字节形式检索内容的方法。但是,它确实提供了 OsStr::encode_wide()
遍历底层 u16
在 Win32 中有用的值。在另一个方向,OsString::from_wide()
可用于创建 OsString
来自 u16
的一片值(value)观。
由您决定您的持久层将如何处理平台之间的这种差异。 Rust 是什么 OsStr
提供了实现往返所需的工具,但代码在平台之间必然会有所不同。例如,serde 通过 effectively treating 解决差异作为enum OsString { Unix(Vec<u8>), Windows(Vec<u16>) }
.
1 Windows 范围的字符串有时被描述为 UTF-16,因为这是它们在更高级别上的解释方式,但这对 所有 操作系统字符串都是不正确的。 Windows 文件名可以包含成对的
u16
不是有效的 UTF-16 值,但仍然可用。这就是为什么不能将 Windows 字符串表示为字节的原因,例如将它们转换为 UTF-8。
关于string - 如何在 Windows 上将 OsStr 转换为 &[u8]/Vec<u8> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43083544/