这是这种情况,我想删除字符串前面的一些无效字节(字符串的不同长度(,起初,我尝试使用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
方法来处理它们。如果你有一片u8
s,其中某些部分是有效的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( 转换为字符串