You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:22:58