Chars, Bytes & Graphemes
Itere str como escalares Unicode (chars), bytes brutos (bytes) ou clusters de grafemas percebidos pelo usuário (crate).
Receita
fn main() {
let s = "e\u{0301}"; // e + acento agudo combinatório
println!("chars: {}", s.chars().count()); // pode ser 2
}Quando usar isso: Limites de comprimento corretos, movimento do cursor, ordenação - não bytes brutos.
Exemplo de Trabalho
fn ascii_words(s: &str) -> impl Iterator<Item = &str> {
s.split_whitespace()
}
fn byte_len(s: &str) -> usize {
s.as_bytes().len()
}
fn main() {
let text = "Hello 世界";
println!("bytes={} chars={}", byte_len(text), text.chars().count());
for w in ascii_words(text) { println!("{w}"); }
}O que isso demonstra:
chars().count()vslen()bytesas_bytes()para trabalho de protocolo- A complexidade dos grafemas precisa de
unicode-segmentationpara UI
Mergulho Profundo
unicode-segmentation = "1"use unicode_segmentation::UnicodeSegmentation;
for g in "👨👩👧".graphemes(true) { println!("{g}"); }Armadilhas
- chars == caracteres do usuário - Falso para marcas combinatórias. Correção: Segmentação de grafemas.
- bytes() para validação UTF-8 - Já válido em
&str. Correção:from_utf8em[u8]. - encode_utf16 para Windows - APIs do sistema operacional às vezes usam UTF-16.
- char tem 32 bits - Não codificado em UTF-8 no tipo
char. - Performance chars nth - O(n).
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
unicode-segmentation | Cursor da UI | Logs apenas ASCII |
| Apenas bytes | Protocolo binário | Texto humano |
encode_utf16 | FFI do Windows | Unix UTF-8 |
FAQs
chars contam emoji duas vezes?
Alguns emojis são multi-escalares - grafemas corrigem.is_ascii?
Caminho rápido para todo ASCII.from_utf8_unchecked?
Inseguro - deve provar validade.encode_utf8 buffer?
encode_utf8 para array na pilha.largura unicode?
crate `unicode-width` para terminais.nfc nfd?
crate `unicode-normalization`.padrão str?
contains, starts_with cientes de caracteres.no_std str?
core `str` é o mesmo.serde char?
Escalar Unicode único em string JSON.testar grafema?
Assertar contagem de segmentação.Relacionados
Versões da Pilha: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.