Get the String length in characters in Rust

Rust

Rust Problem Overview


Based on the Rust book, the String::len method returns the number of bytes composing the string, which may not correspond to the length in characters.

For example if we consider the following string in Japanese, len() would return 30, which is the number of bytes and not the number of characters, which would be 10:

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

The only way I have found to get the number of characters is using the following function:

s.chars().count()

which returns 10, and is the correct number of characters.

Is there any method on String that returns the characters count, aside from the one I am using above?

Rust Solutions


Solution 1 - Rust

> Is there any method on String that returns the characters count, aside from the one I am using above?

No. Using s.chars().count() is correct. Note that this is an O(N) operation (because UTF-8 is complex) while getting the number of bytes is an O(1) operation.

You can see all the methods on str for yourself.

As pointed out in the comments, a char is a specific concept:

> It's important to remember that char represents a Unicode Scalar Value, and may not match your idea of what a 'character' is. Iteration over grapheme clusters may be what you actually want.

One such example is with precomposed characters:

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

You may prefer to use graphemes from the unicode-segmentation crate instead:

use unicode_segmentation::UnicodeSegmentation; // 1.6.0

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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSalvatore CosentinoView Question on Stackoverflow
Solution 1 - RustShepmasterView Answer on Stackoverflow