char::len_utf8 în Rust

Câți octeți ocupă caracterul când este scris în UTF-8, adică într-un String: între 1 și 4.

Sintaxă
pub const fn len_utf8(self) -> usize

Ce face char::len_utf8

Caracterele ASCII (litere englezești, cifre, semne obișnuite) ocupă 1 octet. Literele cu diacritice românești și majoritatea alfabetelor europene ocupă 2 octeți. Caracterele ca € și cele asiatice ocupă 3, iar emoji-urile 4.

Valoarea este utilă când calculezi poziții în octeți pornind de la caractere, de exemplu ca să sari peste caracterul găsit: poz + c.len_utf8(). Nu confunda cu size_of::<char>(), care este mereu 4 (cât ocupă un char separat în memorie).

Ce returnează

usize între 1 și 4.

Exemple

Exemplul 1: Dimensiuni pentru caractere diferite

fn main() {
    for c in ['a', 'ă', 'ș', '€', '中', '🦀'] {
        println!("{c}: len_utf8() = {}", c.len_utf8());
    }
}

Rezultat

a: len_utf8() = 1
ă: len_utf8() = 2
ș: len_utf8() = 2
€: len_utf8() = 3
中: len_utf8() = 3
🦀: len_utf8() = 4

Exemplul 2: Textul de după primul caracter

fn fara_primul(s: &str) -> &str {
    match s.chars().next() {
        Some(c) => &s[c.len_utf8()..],
        None => s,
    }
}

fn main() {
    println!("{}", fara_primul("Ștefan"));
    println!("{}", fara_primul("Ana"));
}

Rezultat

tefan
na

Greșeli frecvente

  • Presupui că fiecare caracter are 1 octet și tai cu &s[1..]. Pe „Ștefan” programul se oprește cu panică.

Comenzi înrudite

  • 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().
  • str::char_indices: Parcurge caracterele împreună cu poziția lor în octeți: perechi (usize, char).