Codificações de Texto
Texto na rede são bytes - UTF-8 é o padrão para APIs do Node 24, e TextEncoder/TextDecoder fornecem conversão padrão da Web com tratamento explícito de erros para entrada malformada.
Busque em todas as páginas da documentação
Texto na rede são bytes - UTF-8 é o padrão para APIs do Node 24, e TextEncoder/TextDecoder fornecem conversão padrão da Web com tratamento explícito de erros para entrada malformada.
const encoder = new TextEncoder(); // sempre UTF-8
const decoder = new TextDecoder('utf-8', { fatal: true });
const bytes = encoder.encode('Hello 世界');
const text = decoder.decode(bytes);const buf = Buffer.from('café', 'utf8');
console.log(buf.toString('utf8'));Quando usar isso:
fetch para stringsTextEncoder do navegador em código isomorfoimport { Buffer } from 'node:buffer';
function decodeUtf8Strict(bytes: Uint8Array): string {
const decoder = new TextDecoder('utf-8', { fatal: true });
try {
return decoder.decode(bytes);
} catch {
throw new Error('Sequência UTF-8 inválida');
}
}
function decodeUtf8Lossy(bytes: Uint8Array): string {
return new TextDecoder('utf-8', { fatal: false }).decode(bytes);
}
const valid = Buffer.from('hello', 'utf8');
const invalid = Buffer.from([0xff, 0xfe, 0xfd]);
console.log(decodeUtf8Strict(valid));
console.log(decodeUtf8Lossy(invalid)); // caracteres de substituição// O Content-Type HTTP deve especificar charset=utf-8
const encoder = new TextEncoder();
const body = encoder.encode(JSON.stringify({ greeting: '你好' }));O que isso demonstra:
fatal: true rejeita sequências inválidas - correto para parsers sensíveis à segurançafatal: false substitui U+FFFD - OK para exibição gerada pelo usuário com avisosTextEncoder suporta apenas UTF-8 por especificação - use iconv-lite para codificações legadasBuffer.toString('utf8') substitui bytes inválidos por padrão - similar ao decodificador não fatalEF BB BF) é opcional; remova ao analisar JSON que deve começar com {.hex, base64, base64url, latin1 para protocolos específicos - não para texto geral.| Codificação | Uso |
|---|---|
| UTF-8 | Padrão para HTTP, JSON, arquivos |
| hex / base64 | Binário em canais de texto |
| latin1 | Legado de 1 byte - evite para texto novo |
| iconv | Shift_JIS, legado Windows-1252 |
function assertUtf8Json(raw: Buffer): unknown {
const text = new TextDecoder('utf-8', { fatal: true }).decode(raw);
return JSON.parse(text);
}binary preserva bytes - armadilha legada. Correção: use Buffer ou Uint8Array para binário.filename* do RFC 5987. Correção: use parsers de framework testados para i18n.str.normalize('NFC') antes de comparar.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
iconv-lite | Codificações legadas do Windows/Ásia | Novas APIs apenas UTF-8 |
Buffer.toString('utf8') | Scripts rápidos apenas do Node | Necessidade de paridade com a API Web |
| Streams + transform | Arquivos de texto enormes | Pequenas conversões de string |
util.TextDecoder importação legada | - | Use TextDecoder global no Node 24 |
Buffer.toString() sem codificação usa utf8. HTTP deve declarar charset=utf-8 explicitamente.
Lança TypeError em sequências de bytes inválidas em vez de inserir caracteres de substituição.
Bibliotecas chardet adivinham - prefira contrato UTF-8 explícito; adivinhar é arriscado para segurança.
O texto JSON é Unicode - UTF-8 é o padrão na rede. JSON.parse espera escapes Unicode adequados em strings.
Variante base64 segura para URL - Buffer.from(s, 'base64url') para segmentos JWT.
Buffer.byteLength(str, 'utf8') - não str.length (unidades de código UTF-16).
decode(uint8, { stream: true }) para análise incremental de entrada fragmentada.
Emojis são multibyte em UTF-8 - ainda válidos; clusters de grafemas precisam de tratamento especial para limites de "comprimento".
Se bytes[0]===0xEF && bytes[1]===0xBB && bytes[2]===0xBF, fatie a partir do offset 3 antes de JSON.parse.
Apenas para protocolos legados verdadeiramente de byte único - nunca para texto de usuário em novas APIs.
response.text() usa UTF-8 por WHATWG; use arrayBuffer() para binário.
Mapeie para 400 invalid_encoding - não repita bytes brutos em mensagens de erro.
Versões da Pilha: Esta página foi escrita para Node.js 24.18.0 (LTS Ativo), npm 10+, TypeScript 5.6+, Express 5, Fastify 5, e NestJS 11.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026