获取Rust中字符串的字符串长度

Sal*_*ino 18 rust

根据Rust ,该String::len方法返回组成字符串的字节数,这可能与字符长度不对应.

例如,如果我们在日语中考虑以下字符串,则len()返回30,这是字节数而不是字符数,这将是10:

let s = String::from("??????????");
s.len() // returns 30.
Run Code Online (Sandbox Code Playgroud)

我找到获取字符数的唯一方法是使用以下函数:

s.chars().count()
Run Code Online (Sandbox Code Playgroud)

返回10,是正确的字符数.

String除了上面使用的那个之外,还有什么方法可以返回字符数吗?

She*_*ter 18

String除了上面使用的那个之外,还有什么方法可以返回字符数吗?

不,使用s.chars().count()是正确的.请注意,这是O(N)操作(因为UTF-8很复杂),而获取字节数是O(1)操作.

您可以自己查看所有方法str.

正如评论中指出的那样,a char是一个特定的概念:

重要的是要记住char代表Unicode标量值,并且可能与您对"字符"的概念不符.对字形集群的迭代可能是你真正想要的.

一个这样的例子是预先组合的字符:

fn main() {
    println!("{}", "e?".chars().count()); // 2
    println!("{}", "é".chars().count()); // 1
}
Run Code Online (Sandbox Code Playgroud)

  • BTW的.chars().count()'是unicode代码点的数量,你可以使用[unicode-segmentation](https://crates.io/crates/unicode-segmentation)来分割字形. (4认同)
  • @SalvatoreCosentino直截了当地说,计算一个字符串中的字符是**不简单**(另见[为什么大写字符串的第一个字母如此复杂?](/sf/ask/2688475541/ 155423))如果您避免使用Rust包装箱,您将受到极大的保护.许多程序员都错误地认为处理自然语言应该"容易",允许许多程序简单地弄错.Rust正在努力避免这种命运. (2认同)