str::chars în Rust

Parcurge textul caracter cu caracter (char Unicode), nu octet cu octet. Cu count() afli numărul de litere.

Sintaxă
pub fn chars(&self) -> Chars<'_>

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ă cu for c in s.chars() sau char_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().