char în Rust

Un singur caracter Unicode, scris între apostrofuri ('ș'); ocupă mereu 4 octeți în memorie.

Sintaxă
let c: char = 'ș';
let cod = c as u32;          // 537 (U+0219)
let d = char::from_u32(0x21B); // Some('ț')

Ce face char

char ține exact un „scalar Unicode”: o literă din orice alfabet, o cifră, un semn sau un emoji simplu. Se scrie între apostrofuri ('a', 'ș', '€'); ghilimelele ("a") dau un text &str, nu un char. În memorie un char ocupă întotdeauna 4 octeți, chiar dacă în UTF-8, într-un String, ocupă între 1 și 4.

Primești char-uri când parcurgi un text cu chars(). Metodele lui verifică felul caracterului (is_alphabetic, is_numeric, is_whitespace), schimbă litera mare/mică (to_uppercase) sau îl transformă în cifră (to_digit). Codul Unicode se află cu c as u32, iar drumul invers cu char::from_u32.

Se poate scrie un caracter și după cod: '\u{0219}' este ș. Caracterele speciale au forme scurte: '\n', '\t', '\'', '\\'.

Parametri

Parametru Descriere
'x' Literal de caracter, între apostrofuri.
'\u{...}' Caracter dat prin codul Unicode în hexazecimal (1–6 cifre).

Ce returnează

Un char este o valoare simplă, care se copiază (implementează Copy).

Exemple

Exemplul 1: Caractere, coduri și dimensiuni

fn main() {
    for c in ['a', 'ș', 'Ț', '€', '🦀'] {
        println!("{c}  U+{:04X}  octeți în UTF-8: {}", c as u32, c.len_utf8());
    }
    println!("char ocupă {} octeți în memorie", std::mem::size_of::<char>());
    println!("{}", '\u{0219}');
}

Rezultat

a  U+0061  octeți în UTF-8: 1
ș  U+0219  octeți în UTF-8: 2
Ț  U+021A  octeți în UTF-8: 2
€  U+20AC  octeți în UTF-8: 3
🦀  U+1F980  octeți în UTF-8: 4
char ocupă 4 octeți în memorie
ș

Exemplul 2: Clasificarea caracterelor dintr-un text

fn main() {
    let text = "Bună! Am 3 mere.";
    let (mut litere, mut cifre, mut spatii, mut altele) = (0, 0, 0, 0);
    for c in text.chars() {
        if c.is_alphabetic() {
            litere += 1;
        } else if c.is_numeric() {
            cifre += 1;
        } else if c.is_whitespace() {
            spatii += 1;
        } else {
            altele += 1;
        }
    }
    println!("litere: {litere}, cifre: {cifre}, spații: {spatii}, altele: {altele}");
}

Rezultat

litere: 10, cifre: 1, spații: 3, altele: 2

Greșeli frecvente

  • Scrii 'ab' sau 'Iași': un literal char poate conține un singur caracter. Pentru texte folosește ghilimele.
  • Compari un char cu un text: c == "a" nu compilează (expected `char`, found `&str`). Scrie c == 'a'.
  • Crezi că orice „literă de pe ecran” este un char. Emoji compuse (👨‍👩‍👧, steaguri) sunt mai multe char-uri lipite.

Comenzi înrudite

  • str::chars: Parcurge textul caracter cu caracter (char Unicode), nu octet cu octet. Cu count() afli numărul de litere.
  • char::len_utf8: Câți octeți ocupă caracterul când este scris în UTF-8, adică într-un String: între 1 și 4.
  • char::from_u32: Creează un char din codul lui Unicode, dacă este valid; altfel returnează None.
  • char::is_alphabetic: Verifică dacă un caracter este literă (is_alphabetic) sau literă ori cifră (is_alphanumeric), după Unicode.
  • String: Textul care îți aparține și se poate modifica: UTF-8, pe heap, crește singur. Diferența față de &str.