web-dev-qa-db-fra.com

Obtenez la longueur de chaîne en caractères dans Rust

Basée sur la Rust book , la méthode String::len Renvoie le nombre d'octets composant la chaîne, qui peut ne pas correspondre à la longueur en caractères.

Par exemple, si nous considérons la chaîne suivante en japonais, len() retournerait 30, qui est le nombre d'octets et non le nombre de caractères, qui serait 10:

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

Le seul moyen que j'ai trouvé pour obtenir le nombre de caractères est d'utiliser la fonction suivante:

s.chars().count()

qui renvoie 10 et est le nombre correct de caractères.

Existe-t-il une méthode sur String qui renvoie le nombre de caractères, à part celle que j'utilise ci-dessus?

17
Salvatore Cosentino

Existe-t-il une méthode sur String qui renvoie le nombre de caractères, à part celle que j'utilise ci-dessus?

Non. L'utilisation de s.chars().count() est correcte. Notez qu'il s'agit d'une opération O(N) (car UTF-8 est complexe) tandis que l'obtention du nombre d'octets est une opération O(1)).

Vous pouvez voir toutes les méthodes sur str par vous-même.

Comme indiqué dans les commentaires, un char est un concept spécifique:

Il est important de se rappeler que char représente une valeur scalaire Unicode et peut ne pas correspondre à votre idée de ce qu'est un "caractère". L'itération sur les grappes de graphèmes peut être ce que vous voulez réellement.

Un tel exemple est avec des caractères précomposés:

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