正如SirDarius所说的, 您可以尝试使用core::str::from_utf8
。但是您需要了解并不是每个UTF8字符串都是ASCII字符串。我的意思是:仅因为一个字节数组可以被解释为UTF8字符串,并不意味着它可以被解释为ASCII字符串。
换句话说,只有当您已经知道字节数组确实是ASCII时,core::str::from_utf8
才能正常工作。
但在这种情况下,更有效的方法是直接使用core::str::from_utf_unchecked
,因为from_utf8
的文档中写道:
如果您确定字节片段是有效的UTF-8,并且您不想承担有效性检查的开销,则有一个不安全版本的此函数,from_utf8_unchecked,其行为相同但跳过了检查。
这是一个示例,您可以从一个
无效的ASCII数组中获取有效字符串:
fn main() {
let buffer = [ 226, 154, 160 ];
let str = core::str::from_utf8(&buffer).unwrap();
println!("{}", str);
}
自己运行这个例子
相反,您需要先扫描字节数组以查找无效的ASCII字符。
解决方案
fn get_ascii_str<'a>(buffer: &'a [u8]) -> Result<&'a str, ()> {
for byte in buffer.into_iter() {
if byte >= &128 {
return Err(());
}
}
Ok(unsafe {
core::str::from_utf8_unchecked(buffer)
})
}
注意:此函数适用于
[no_std]
环境。
示例:
fn main() {
let buffer = [ 226, 154, 160 ];
assert_eq!(Err(()), get_ascii_str(&buffer));
let buffer = [
'H' as u8,
'e' as u8,
'l' as u8,
'l' as u8,
'o' as u8,
',' as u8,
' ' as u8,
'w' as u8,
'o' as u8,
'r' as u8,
'l' as u8,
'd' as u8,
'!' as u8,
];
let str = get_ascii_str(&buffer).unwrap();
println!("{}", str);
}
fn get_ascii_str<'a>(buffer: &'a [u8]) -> Result<&'a str, ()> {
}
自己运行这个例子