Rust中对含北欧字母的字符串切片报错问题求助
Rust中UTF-8字符串切片报错的解决方法
Rust里的String和&str是UTF-8编码的字节序列,像ä、å、ö这类非ASCII字符每个占用2个字节。你直接用&str[1..]按字节索引切片时,索引1落在第一个字符ä的字节范围内(字节0-1),并非合法的字符边界,因此触发panic。
下面是几种安全的解决方式:
使用
chars()迭代器生成新字符串
通过chars()迭代每个Unicode字符,跳过指定数量后重新收集为String:fn main() { let s = "äåö".to_string(); let result: String = s.chars().skip(1).collect(); println!("{}", result); // 输出 "åö" }使用
str::split_at_boundary(Rust 1.77.0+)
这个标准库方法可以安全地按字符边界分割字符串,返回分割后的两个&str,避免panic:fn main() { let s = "äåö"; if let Some((_, rest)) = s.split_at_boundary(1) { println!("{}", rest); // 输出 "åö" } }手动计算字符边界的字节索引
若需要获取&str类型结果,可通过遍历字符累加字节长度,找到合法的切片起始索引:fn main() { let s = "äåö"; let mut byte_idx = 0; let mut chars = s.chars(); if chars.next().is_some() { byte_idx = s.len() - chars.as_str().len(); } let rest = &s[byte_idx..]; println!("{}", rest); // 输出 "åö" }
内容的提问来源于stack exchange,提问作者stackoverflowuser
相关产品推荐
相关产品推荐

