2017-09-19 1 views
4

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

Par exemple, si l'on considère la chaîne suivante en japonais, len() reviendriez 30, qui est le nombre d'octets et non le nombre de caractères, ce qui serait 10:

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

La seule façon que j'ai trouvé pour obtenir le nombre de caractères utilise la fonction suivante:

s.chars().count() 

qui retourne 10, et le nombre correct de caractères.

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

+2

Notez que ce idiosyncrasies donné Unicode, « nombre de caractères » ne signifie probablement pas que vous pensez. Par exemple, cette chaîne: "é" a _two_ caractères comme en témoigne le terrain de jeu: https://play.rust-lang.org/?gist=143ea763c0b16bd4ee12e628fb7ff4ca&version=stable, bien que cette chaîne: "é" n'a qu'un seul caractère: https : //play.rust-lang.org/? gist = af950651bb6394e7bc2a966147e1b035 & version = stable – Jmb

+2

voir aussi https://crates.io/crates/unicode-segmentation – user25064

Répondre

7

Existe-t-il une méthode sur String qui renvoie le nombre de caractères, mis à part celui 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) alors que l'obtention du nombre d'octets est une opération O (1). Vous pouvez voir all the methods on str pour vous.

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

Il est important de se rappeler que char représente un Unicode Scalar valeur, et peut ne pas correspondre à votre idée de ce qu'est un « caractère » est. 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 
} 
+1

BT.c's.chars(). count() 'est le nombre d'unicode les points de code, vous pouvez utiliser [unicode-segmentation] (https://crates.io/crates/unicode-segmentation) pour diviser sur les graphèmes. –

+0

@Shepmaster, merci de votre réponse. Je savais que les caractères et les cordes étaient différents, comme vous pouvez le deviner d'après ma question. Je me demandais simplement s'il y avait une façon plus efficace et intuitive de le faire. –

+0

@ GrégoryOBANOS merci pour votre commentaire, mais je ne prévois pas d'installer quoi que ce soit pour quelque chose qui devrait être simple. –