Codificaciones de texto
El texto en la red son bytes. UTF-8 es el predeterminado para las API de Node 24, y TextEncoder/TextDecoder proporcionan una conversión estándar web con manejo explícito de errores para entradas malformadas.
Busca en todas las páginas de la documentación
El texto en la red son bytes. UTF-8 es el predeterminado para las API de Node 24, y TextEncoder/TextDecoder proporcionan una conversión estándar web con manejo explícito de errores para entradas malformadas.
const encoder = new TextEncoder(); // siempre 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'));Cuándo usarlo:
fetch a cadenasTextEncoder del navegador en 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('Invalid UTF-8 sequence');
}
}
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 reemplazo// HTTP Content-Type debe especificar charset=utf-8
const encoder = new TextEncoder();
const body = encoder.encode(JSON.stringify({ greeting: '你好' }));Lo que esto demuestra:
fatal: true rechaza secuencias incorrectas, adecuado para analizadores sensibles a la seguridadfatal: false sustituye U+FFFD, aceptable para visualización generada por el usuario con advertenciasTextEncoder solo admite UTF-8 según la especificación; usa iconv-lite para codificaciones heredadasBuffer.toString('utf8') reemplaza los bytes inválidos por defecto, similar al decodificador no fatalEF BB BF) es opcional; elimínalo al analizar JSON que debe comenzar con {.hex, base64, base64url, latin1 para protocolos específicos, no para texto general.| Codificación | Uso |
|---|---|
| UTF-8 | Predeterminado para HTTP, JSON, archivos |
| hex / base64 | Binario en canales de texto |
| latin1 | Heredado de 1 byte - evita para texto nuevo |
| iconv | Heredado de Shift_JIS, Windows-1252 |
function assertUtf8Json(raw: Buffer): unknown {
const text = new TextDecoder('utf-8', { fatal: true }).decode(raw);
return JSON.parse(text);
}binary conserva los bytes - un error heredado. Solución: usa Buffer o Uint8Array para binarios.filename* codificación de porcentaje UTF-8. Solución: usa analizadores de framework probados para i18n.str.normalize('NFC') antes de comparar.| Alternativa | Cuándo usar | Cuándo NO usar |
|---|---|---|
iconv-lite | Codificaciones heredadas de Windows/Asia | Nuevas API solo UTF-8 |
Buffer.toString('utf8') | Scripts rápidos solo de Node | Necesidad de paridad con la API web |
| Streams + transform | Archivos de texto enormes | Conversiones de cadenas pequeñas |
Importación heredada de util.TextDecoder | - | Usa TextDecoder global en Node 24 |
Buffer.toString() sin codificación usa utf8. HTTP debe declarar charset=utf-8 explícitamente.
Lanza TypeError en secuencias de bytes inválidas en lugar de insertar caracteres de reemplazo.
Las bibliotecas chardet adivinan; prefiere un contrato UTF-8 explícito; adivinar es arriesgado para la seguridad.
El texto JSON es Unicode; UTF-8 es estándar en la red. JSON.parse espera escapes Unicode adecuados en las cadenas.
Variante de base64 segura para URL; Buffer.from(s, 'base64url') para segmentos JWT.
Buffer.byteLength(str, 'utf8'), no str.length (unidades de código UTF-16).
decode(uint8, { stream: true }) para el análisis incremental de entradas en trozos.
Los emojis son multibyte en UTF-8; siguen siendo válidos; los clústeres de grafemas necesitan un manejo especial para los límites de "longitud".
Si bytes[0]===0xEF && bytes[1]===0xBB && bytes[2]===0xBF, corta desde el desplazamiento 3 antes de JSON.parse.
Solo para verdaderos protocolos heredados de un solo byte; nunca para texto de usuario en nuevas API.
response.text() usa UTF-8 según WHATWG; usa arrayBuffer() para binarios.
Mapea a 400 invalid_encoding; no muestres bytes sin procesar en los mensajes de error.
Versiones de pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 16 jul 2026