Rust中如何获取UTF-8字符的切片?
获取UTF-8字符串的最后两个字符切片
在Rust中直接按字节索引截取UTF-8字符串会出错,因为UTF-8字符的字节长度不固定。针对你的需求,有两种常用方案:
方案1:获取原字符串的&str切片(零额外内存分配)
利用char_indices()方法遍历字符串,它会返回每个字符的起始字节位置和字符本身。通过找到倒数第二个字符的起始字节索引,就能安全地截取原字符串的切片:
let word = "Хороший"; // 获取字符与对应起始字节的迭代器 let mut char_indices = word.char_indices(); // 计算总字符数,跳过前 (总字符数-2) 个,得到倒数第二个字符的起始位置 let total_chars = word.chars().count(); let (start_idx, _) = char_indices.nth(total_chars - 2).unwrap(); // 从起始位置到末尾截取切片 let last_two_chars = &word[start_idx..]; println!("{}", last_two_chars); // 输出 "ий"
方案2:生成新的String(需要内存分配)
如果不需要原字符串的引用,可以直接收集字符生成新的String,之后也可以通过&String得到&str:
let word = "Хороший"; let total_chars = word.chars().count(); let i = 2; // 要获取的字符数 // 跳过前 (总字符数-i) 个字符,收集剩余字符为String let last_two: String = word.chars().skip(total_chars - i).collect(); println!("{}", last_two); // 输出 "ий" // 若需要&str,直接取引用即可 let last_two_str: &str = &last_two;
注意点
你之前的代码存在一个问题:迭代器只能被消费一次。调用chars.count()后,原迭代器已经被耗尽,再调用chars.skip()会无效。所以必须先单独计算总字符数,再重新生成迭代器进行skip操作。
内容的提问来源于stack exchange,提问作者Andrey Korostin
相关产品推荐
相关产品推荐

