我Vec<u8>从文件中读取了一个字节 - 这些字节是文本格式(可能是 UTF-16 或其他一些愚蠢的 2 字节格式),我想将其转换为 UTF-8。
let title = Vec::from_iter(bytes.take(title_length));
// Some Vec<u8> to &[u16] magic
let title = String::from_utf16_lossy(title);
Run Code Online (Sandbox Code Playgroud)
目前我正在使用这个相当脏的代码:
let title: &[u16] = unsafe { std::slice::from_raw_parts(title_data.as_ptr(), title_data.len()) };
Run Code Online (Sandbox Code Playgroud)
虽然这应该有效,但我可能由于调用而收到错误take():
error: mismatched types:
expected `*const u16`,
found `*const core::result::Result<u8, std::io::error::Error>`
(expected u16,
found enum `core::result::Result`) [E0308]
Run Code Online (Sandbox Code Playgroud)
我应该使用map迭代take器还是其他东西?
以防万一您需要安全地进行操作,
let title = Vec::from_iter(bytes.take(title_length));
let title: Vec<u16> = title
.chunks_exact(2)
.into_iter()
.map(|a| u16::from_ne_bytes([a[0], a[1]]))
.collect();
let title = title.as_slice();
let title = String::from_utf16_lossy(title);
Run Code Online (Sandbox Code Playgroud)
请注意,这将分配内存,并进行额外的复制(不安全的替代方案不会这样做)。
有两个错误。首先,你需要.unwrap()你的Result(of from_raw_parts(..),我认为),其次长度太大,因为 au16占用了 a 空间的两倍u8,所以你需要除以 2。
| 归档时间: |
|
| 查看次数: |
6981 次 |
| 最近记录: |