如何从字符串中删除尾随的空字符?

17

我在处理UTF-8编码字符串时遇到了去除尾部空字符的问题:

enter image description here

如何从一个 String 中删除这些字符?

以下是我用于从 Vec 创建 String 的代码:

let mut data: Vec<u8> = vec![0; 512];
// populate data
let res = String::from_utf8(data).expect("Found invalid UTF-8");

1
可能与 https://dev59.com/n4zda4cB1Zd3GeqPmnIo 相关。 - ArtemGr
1
填充是否全部为\0?通常C字符串在字符串后面包含一个\0,之后的每个字符可能都是垃圾。 - CodesInChaos
3
很高兴你得到了答案,但实际上这里的正确答案似乎是一开始就不要放置空字节。我假设你的代码片段并不是真正的实际代码,只是一个例子? - loganfsmyth
1个回答

40
您可以使用trim_matches从字符串中修剪自定义模式。模式可以是空字符:
fn main() {
    let mut data: Vec<u8>  = vec![0; 8];
    
    data[0] = 104;
    data[1] = 105;
    
    let res = String::from_utf8(data).expect("Found invalid UTF-8");
    println!("{}: {:?}", res.len(), res);
    // 8: "hi\u{0}\u{0}\u{0}\u{0}\u{0}\u{0}"
    
    let res = res.trim_matches(char::from(0));
    println!("{}: {:?}", res.len(), res);
    // 2: "hi"
}

这将从两侧删除0。如果您只想删除尾随的0,请改用trim_end_matches


太棒了!我知道一定有简单的方法来做到这件事! - user1094865
1
顺便说一句,如果0字节存在是因为您预先分配了数据缓冲区,您可以通过使用Vec::with_capacity(512)初始化数据并根据需要填充它来完全避免它们。 - MB-F

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接