我试图将原始OS文件名持久化到存储中,所以我需要获得OsStr
的原始字节.
在*nix平台上调用as_bytes()
似乎是可能的,但在MS Windows上没有定义.
有没有一种将OsStr
字节转换成字节的便携式方法?
我试图将原始OS文件名持久化到存储中,所以我需要获得OsStr
的原始字节.
在*nix平台上调用as_bytes()
似乎是可能的,但在MS Windows上没有定义.
有没有一种将OsStr
字节转换成字节的便携式方法?
OsStr
的意义在于,它的表现形式是特定于操作系统的.由于技术原因,实现有些复杂(@Shepmaster's answer提供了更多细节),但您可以这样想:
OsStr
归结为&[u8]
,因为POSIX函数接受并返回字节字符串;OsStr
可以被认为是&[u16]
,因为Win32 Unicode函数接受并返回字符串作为16位单元的array.由于本机Windows API接受16位"宽字符"序列1,这就是OsStr
的设计目的.由于任何东西都可以转换为字节,所以OsStr
字节可以转换为字节,但这种表示方式没有用处,因为这些字节对用户和系统都没有意义.这就是为什么OsStr
没有提供在Windows上以字节形式检索内容的方法.然而,它确实提供了OsStr::encode_wide()
,可以迭代底层的u16
个值,这些值在Win32中很有用.在另一个方向上,OsString::from_wide()
可用于从u16
个值的切片创建OsString
.
由您决定持久层将如何处理平台之间的这种差异.Rust's OsStr
提供的是实现往返所需的tools,但不同平台的代码必然不同.例如,serde将差值effectively treating解析为enum OsString { Unix(Vec<u8>), Windows(Vec<u16>) }
.
u16
values that are not valid UTF-16, and still be usable. This is why it's not possible to represent Windows strings as bytes by e.g. converting them to UTF-8.
未被发送