面试题答案
一键面试将 String
转换为 Vec<u8>
可以使用 String
的 into_bytes
方法将 String
转换为 Vec<u8>
。示例代码如下:
fn main() {
let s = String::from("hello");
let bytes: Vec<u8> = s.into_bytes();
println!("{:?}", bytes);
}
将 Vec<u8>
转换为 String
可以使用 String
的 from_utf8
方法将 Vec<u8>
转换为 String
。示例代码如下:
fn main() {
let bytes = vec![104, 101, 108, 108, 111];
let s = String::from_utf8(bytes);
match s {
Ok(s) => println!("{}", s),
Err(e) => println!("转换错误: {:?}", e),
}
}
转换过程中可能遇到的问题及解决方案
from_utf8
失败:from_utf8
方法要求Vec<u8>
中的字节必须是有效的 UTF - 8 编码。如果字节序列不是有效的 UTF - 8 编码,from_utf8
会返回一个Err
。 解决方案:在调用from_utf8
之前,确保字节序列是有效的 UTF - 8 编码。如果不确定,可以先使用std::str::from_utf8
进行验证,它会返回一个Result<&str, Utf8Error>
,如果验证通过再转换为String
。示例代码如下:
fn main() {
let bytes = vec![104, 101, 108, 108, 111];
let result = std::str::from_utf8(&bytes);
match result {
Ok(s) => {
let s = String::from(s);
println!("{}", s);
},
Err(e) => println!("验证错误: {:?}", e),
}
}
into_bytes
丢失信息:into_bytes
方法会按照 UTF - 8 编码规则将字符串转换为字节序列。如果原始字符串包含非 ASCII 字符,字节序列可能与直观预期不同。 解决方案:如果需要保留字符信息,可以考虑使用其他编码格式,如UTF - 16
,不过在 Rust 中处理UTF - 16
不像处理UTF - 8
那样原生和方便。一般情况下,使用UTF - 8
是符合现代编程习惯和互联网标准的,在大多数场景下不会有问题。