Rust的String有返回字符数而不是字节数的方法吗?

nzkunb0c  于 2023-01-02  发布在  其他
关注(0)|答案(1)|浏览(138)

基于Rust bookString::len方法返回组成字符串的字节数,这可能与字符长度不对应。
例如,如果我们考虑以下日语字符串,len()将返回30,这是字节数而不是字符数,字符数将是10:

let s = String::from("ラウトは難しいです!");
s.len() // returns 30.

我发现获得字符数的唯一方法是使用以下函数:

s.chars().count()

返回10,是正确的字符数。
除了我上面使用的方法之外,String上还有其他方法可以返回字符数吗?

vddsk6oq

vddsk6oq1#

除了我上面使用的方法之外,String上还有其他方法可以返回字符数吗?
不可以。使用s.chars().count()是正确的。请注意,这是一个O(N)操作(因为UTF-8是复杂的),而获取字节数是一个O(1)操作。
您可以亲自查看all the methods on str
正如评论中所指出的,char是一个特定的概念:
记住char表示Unicode标量值是很重要的,它可能与您对“字符”的概念不匹配。在字素簇上迭代可能是您实际想要的。
一个这样的例子是使用预组合字符:

fn main() {
    println!("{}", "é".chars().count()); // 2
    println!("{}", "é".chars().count()); // 1
}

您可能更愿意使用unicode-segmentation机箱中的graphemes

use unicode_segmentation::UnicodeSegmentation; // 1.6.0

fn main() {
    println!("{}", "é".graphemes(true).count()); // 1
    println!("{}", "é".graphemes(true).count()); // 1
}

相关问题