从字符串(包括无效字节)中有效删除前缀



这是这种情况,我想删除字符串前面的一些无效字节(字符串的不同长度(,起初,我尝试使用drain方法,但正如文档所说:

如果起点或终点不在字符上,则惊慌失措 边界,或者如果它们超出边界。

所以我尝试使用 for 循环来remove前缀


let mut input = String::from_utf8_lossy(&[128,2,49]).into_owned();
let len = 2;
for _ in 0..len {
input.remove(0);
}

有什么方法可以提高效率吗?

创建包含无效(即非 UTF8(字节的String是不合理的,因此您不能使用String方法来处理它们。如果你有一片u8s,其中某些部分是有效的UTF-8,最好的处理方法是只转换有效的部分:

let raw_input: &'static [u8] = &[128, 2, 49];
let len = 2;
let input = str::from_utf8(raw_input[len..]).unwrap().to_owned();

如果raw_input[len..]不是以有效的 UTF-8 字符编码开头,str::from_utf8()将返回一个Err值(.unwrap()会变成 panic(,因此这仅在您知道 UTF-8 数据从len开始时才适用。这与from_utf8_lossy的行为不同,后者将无效的 UTF-8 序列转换为 ,但如果字符串是格式正确的 UTF-8,除了前导"垃圾",则不需要from_utf8_lossy

无需为此使用unsafe

另请参阅: 如何将字节向量 (u8( 转换为字符串

最新更新