Ce face str::chars
chars() returnează un iterator care decodează UTF-8 și dă fiecare caracter ca char. Litera ș apare o singură dată, deși ocupă doi octeți. Este modul corect de a număra literele (chars().count()), de a lua a n-a literă (chars().nth(n)) sau de a inversa un text (chars().rev()).
Metoda este definită pe str și se folosește la fel pe un String. Pentru că parcurge textul de la început, nth(n) și count() durează proporțional cu lungimea; dacă ai nevoie de multe accese după poziție, strânge caracterele într-un Vec<char>.
Un char este un „scalar Unicode”, nu neapărat ce vede omul ca literă. Emoji compuse (familii, steaguri) sau litere scrise cu semn combinat apar ca mai multe char-uri.
Ce returnează
Un iterator Chars de valori char, care se poate parcurge și de la coadă (rev).
Exemple
Exemplul 1: Numărarea literelor și accesul după poziție
fn main() {
let s = String::from("Mărțișor");
println!("octeți: {}, litere: {}", s.len(), s.chars().count());
println!("prima: {:?}, a patra: {:?}, ultima: {:?}",
s.chars().next(), s.chars().nth(3), s.chars().last());
let invers: String = s.chars().rev().collect();
println!("invers: {invers}");
}
Rezultat
octeți: 11, litere: 8
prima: Some('M'), a patra: Some('ț'), ultima: Some('r')
invers: roșițrăM
Exemplul 2: Numărarea vocalelor cu diacritice
fn main() {
let text = "Învățătoarea a venit în clasă";
let vocale = text
.chars()
.filter(|c| "aăâeiîouAĂÂEIÎOU".contains(*c))
.count();
println!("vocale: {vocale}");
}
Rezultat
vocale: 13
Exemplul 3: Un Vec pentru acces rapid după poziție
fn main() {
let litere: Vec<char> = "Timișoara".chars().collect();
println!("{} litere; a 4-a este '{}'", litere.len(), litere[3]);
let palindrom = "capac".chars().eq("capac".chars().rev());
println!("capac este palindrom: {palindrom}");
}
Rezultat
9 litere; a 4-a este 'i'
capac este palindrom: true
Greșeli frecvente
- Folosești
bytes()sau indexare pe octeți pentru texte românești și primești bucăți din litere. - Apelezi
s.chars().nth(i)într-o buclă de la 0 la n: fiecare apel pornește de la început, deci totul devine lent pe texte mari. Parcurge o singură dată cufor c in s.chars()sauchar_indices.
Comenzi înrudite
str::char_indices: Parcurge caracterele împreună cu poziția lor în octeți: perechi (usize, char).str::bytes: Accesul la octeții UTF-8 ai textului: bytes() ca iterator de u8, as_bytes() ca felie &[u8].char: Un singur caracter Unicode, scris între apostrofuri (‘ș’); ocupă mereu 4 octeți în memorie.String::len: Lungimea textului în OCTEȚI (nu în litere) și verificarea dacă textul e gol. Pentru litere: chars().count().