string - 如何在 Windows 上将 OsStr 转换为 &[u8]/Vec<u8> ?

标签 string rust

我正在尝试将原始操作系统文件名保存到存储中,因此我需要获取 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/

相关文章:

enums - 如何处理 flat_map 中的单个元素?

macros - 如何将包含多个项目的宏传递给宏?

string - 在 Go 中处理动态错误(特别是 database/sql 包)

python - 在python中将特殊字符转换为原始形式

PHP substr 和 strlen 的替代方案

Python 字符串到其他类

unit-testing - serde 实现中的模拟实例

python - 我如何区分python中字符串中的制表符和空格

rust - 将整数转换为 float 时如何添加正确的类型注释?

vector - 用任何类型的元组定义向量