str::bytes în Rust

Accesul la octeții UTF-8 ai textului: bytes() ca iterator de u8, as_bytes() ca felie &[u8].

Sintaxă
pub fn bytes(&self) -> Bytes<'_>
pub const fn as_bytes(&self) -> &[u8]

Ce face str::bytes

bytes() parcurge textul octet cu octet (u8), iar as_bytes() îți dă direct felia &[u8], pe care o poți indexa: s.as_bytes()[0]. Niciuna nu copiază textul.

Lucrul pe octeți este potrivit pentru formate care folosesc doar ASCII (coduri, cifre, protocoale) și pentru funcții care cer octeți (scriere în fișiere, sume de control). Pentru litere românești folosește chars(): un ș apare ca doi octeți separați (200 și 153).

Ce returnează

bytes: iterator de u8. as_bytes: &[u8] împrumutat.

Exemple

Exemplul 1: Octeți și caractere, comparat

fn main() {
    let s = "Iași";
    let octeti: Vec<u8> = s.bytes().collect();
    let litere: Vec<char> = s.chars().collect();
    println!("bytes:    {octeti:?}");
    println!("chars:    {litere:?}");
    println!("as_bytes: {:?}, primul octet: {}", s.as_bytes(), s.as_bytes()[0]);
}

Rezultat

bytes:    [73, 97, 200, 153, 105]
chars:    ['I', 'a', 'ș', 'i']
as_bytes: [73, 97, 200, 153, 105], primul octet: 73

Exemplul 2: Suma cifrelor dintr-un cod, pe octeți

Cifrele ASCII au codurile 48..57, deci b - b'0' dă valoarea cifrei.

fn main() {
    let cod = "RO-4071";
    let suma: u32 = cod
        .bytes()
        .filter(|b| b.is_ascii_digit())
        .map(|b| (b - b'0') as u32)
        .sum();
    println!("suma cifrelor din {cod}: {suma}");
}

Rezultat

suma cifrelor din RO-4071: 12

Greșeli frecvente

  • Transformi fiecare octet în char cu b as char pe un text cu diacritice: ș devine două caractere fără sens (È și un caracter de control).

Comenzi înrudite

  • str::chars: Parcurge textul caracter cu caracter (char Unicode), nu octet cu octet. Cu count() afli numărul de litere.
  • String::into_bytes: Transformă String-ul în Vec<u8> cu octeții lui UTF-8, fără copiere; String-ul este consumat.
  • String::from_utf8: Creează un String din octeți: from_utf8 verifică UTF-8 și dă eroare; from_utf8_lossy înlocuiește octeții greșiți cu �.
  • String::len: Lungimea textului în OCTEȚI (nu în litere) și verificarea dacă textul e gol. Pentru litere: chars().count().