Ce face str::char_indices
char_indices() este ca chars(), dar fiecare element este o pereche (poziție, caracter), unde poziția este octetul la care începe caracterul. Pozițiile astea sunt mereu granițe valide, deci le poți folosi sigur pentru tăiere (&s[..poz]), insert, truncate sau split_off.
Observă salturile: după un caracter de 2 octeți, poziția următoare crește cu 2. Nu confunda cu chars().enumerate(), care numără caracterele (0, 1, 2…) și nu dă poziții bune pentru tăiere.
Ce returnează
Un iterator de perechi (usize, char).
Exemple
Exemplul 1: Pozițiile în octeți sar peste diacritice
fn main() {
for (poz, c) in "Țară".char_indices() {
println!("octetul {poz}: {c}");
}
let enumerate: Vec<(usize, char)> = "Țară".chars().enumerate().collect();
println!("cu enumerate: {enumerate:?}");
}
Rezultat
octetul 0: Ț
octetul 2: a
octetul 3: r
octetul 4: ă
cu enumerate: [(0, 'Ț'), (1, 'a'), (2, 'r'), (3, 'ă')]
Exemplul 2: Primele n litere, ca &str, fără copiere
fn primele(text: &str, n: usize) -> &str {
match text.char_indices().nth(n) {
Some((poz, _)) => &text[..poz],
None => text,
}
}
fn main() {
println!("{}", primele("Ștefănești", 4));
println!("{}", primele("Ion", 10));
}
Rezultat
Ștef
Ion
Greșeli frecvente
- Folosești indicele din
chars().enumerate()pentru tăiere și primești panică pe texte cu diacritice.
Comenzi înrudite
str::chars: Parcurge textul caracter cu caracter (char Unicode), nu octet cu octet. Cu count() afli numărul de litere.str::get: Taie textul sigur: get(a..b) returnează None în loc de panică; is_char_boundary verifică o poziție.String::truncate: Scurtează textul la primii new_len octeți; nu face nimic dacă textul e deja mai scurt.str::find: Caută prima (find) sau ultima (rfind) apariție și returnează poziția ei în octeți, sau None.