También disponible en: English · Português · Français · العربية
Codificación de caracteres: todos los charsets del navegador
La lista completa que un navegador debe admitir, un decodificador que corre en el tuyo y a qué resuelve de verdad cada etiqueta.
¿Qué es una codificación de caracteres?
Un archivo contiene bytes. Una codificación de caracteres es el acuerdo que convierte esos bytes en letras: que el byte 0x41 es la A, que los dos bytes 0xC3 0xA9 son é. Si el acuerdo falla aparece el mojibake, los mismos bytes leídos con la tabla equivocada, produciendo é donde debía haber é.
Antes había cientos de estos acuerdos, uno por idioma y por fabricante. La web los redujo: el Encoding Standard de WHATWG enumera exactamente 40 codificaciones y las 228 etiquetas que las nombran, y es esa rareza que es una lista que no puede crecer. Lo dice con sus propias palabras: la tabla recoge todas las codificaciones y etiquetas que un agente de usuario debe admitir, y no debe admitir ninguna otra. Una de las 40 es la vigente. Las otras 39 están bajo encabezados que empiezan por la palabra heredadas.
Ese cierre es lo que separa esta lista de cualquier registro al que se parezca. Un registro anota lo que existe y gana filas. Esta es un techo.
Cómo usarla
- Mete unos bytes. Los dígitos hexadecimales se leen como bytes, así que 93 77 6f 72 6c 64 94 son siete. Cualquier otra cosa se trata como texto y se codifica antes en UTF-8, porque UTF-8 es lo único que un navegador sabe codificar.
- Nombra una codificación. Vale cualquiera de las 228 etiquetas, en cualquier caja. Una etiqueta no reconocida es un fallo y no un regreso silencioso a otra cosa, que es lo que exige el estándar.
- Lee la comparación de abajo. Los mismos bytes se decodifican con cuatro etiquetas distintas que resuelven a una sola codificación, así que las cuatro filas salen idénticas: de eso se trata.
No existe una codificación ASCII, ni Latin-1 tampoco
Pídele ascii a un navegador y te da windows-1252. Pídele us-ascii, iso-8859-1, latin1, cp819 o ansi_x3.4-1968 y te vuelve a dar windows-1252. Diecisiete de las 228 etiquetas se apilan en esa fila, y ni ASCII ni ISO-8859-1 existen en el estándar con nombre propio, mientras que ISO-8859-2 e ISO-8859-15 sí: eso convierte la ausencia en una decisión y no en un descuido.
Importa porque windows-1252 no es ISO-8859-1. Decodificando los 256 valores de byte con ambas definiciones, difieren en 27, y los 27 caen en el rango 0x80 a 0x9F, que ISO-8859-1 llena de códigos de control invisibles y Microsoft llenó de puntuación. El byte 0x80 es el símbolo del euro. Del 0x91 al 0x94 están las comillas tipográficas. El 0x96 y el 0x97 son la raya y el guion largo. El 0x85 son los puntos suspensivos.
O sea que los caracteres donde ambas discrepan son justo los que un procesador de textos inserta sin que se lo pidas, y por eso un documento guardado como Latin-1 y servido como Latin-1 sigue mostrando bien las comillas: el navegador nunca estuvo usando Latin-1. Cinco de los valores que Microsoft dejó vacíos se quedan como caracteres de control en vez de convertirse en U+FFFD, así que en ese rango nada falla nunca al decodificar.
Esto también acota cuánto puede fiarse uno de que una codificación de un byte sea total: entre las 28 codificaciones de un byte hay 150 posiciones sin ningún carácter, que decodifican a U+FFFD, repartidas por nueve de ellas. Que todo byte sea un carácter es una suposición razonable y falsa.
Leer cuarenta, escribir una
Un navegador decodifica las 40. Codifica exactamente una. El estándar fija la propiedad encoding de un codificador de texto en utf-8 y no le da argumento alguno al constructor, así que no hay forma admitida de pedirle a un navegador que escriba Shift_JIS o windows-1251. La sección 4.3 lleva la misma regla más lejos: cuando el análisis de una URL o el envío de un formulario necesitan una codificación de salida, replacement y las dos UTF-16 se reescriben a UTF-8 antes de escribir nada.
Una entrada es más rara que las demás. La codificación llamada replacement no decodifica nada: cualquier entrada no vacía se convierte en un único U+FFFD. Seis etiquetas apuntan a ella, cinco de ellas codificaciones reales y desplegadas: ISO-2022-CN, ISO-2022-KR, HZ-GB-2312 y sus alias. El estándar dice sin rodeos por qué: existe para impedir ataques que se aprovechan del desajuste entre las codificaciones que admite un servidor y las que admite un cliente. ISO-2022-JP sobrevivió a la misma poda solo porque demasiado contenido depende de ella.
Y una etiqueta responde a una pregunta que la gente falla: utf-16, sin indicar el orden de bytes, significa little-endian. La etiqueta unicode también.
Lo que esta página no puede decirte
El decodificador de aquí es el de tu navegador, no el nuestro, y es a propósito: es la única implementación cuya respuesta te importa y es aquella para la que está escrito el estándar. También significa que el resultado puede diferir de otro entorno. Node, por ejemplo, rechaza de plano la codificación replacement aunque el estándar obligue a admitirla, así que algo que aquí decodifica puede no hacerlo en un script.
Segundo, esta página te dice qué significa una etiqueta, no qué es un archivo. Nada dentro de una secuencia de bytes indica qué codificación la produjo; adivinarlo es un problema aparte y mucho más difícil, y la respuesta honesta para cualquier archivo que controles es convertirlo a UTF-8 y dejar de adivinar.
Tercero, este es un estándar de la web. Las bases de datos, los terminales y los lenguajes de programación implementan sus propias tablas y no siempre coinciden. Comparadas byte a byte con los codecs de Python en las 28 codificaciones de un byte, 18 son idénticas y el resto difieren en 89 de 7.168 posiciones, casi siempre donde Python rechaza un byte que Microsoft dejó indefinido y un navegador devuelve en cambio un carácter de control. Queda un desacuerdo real, en dos posiciones de KOI8-U, donde ambos proyectos heredaron versiones distintas de la misma codificación.
¿Por qué es gratis?
La tabla son unos pocos kilobytes que viajan con la página, y de decodificar se encarga el navegador que ya tienes. Nada de lo que escribes se sube, no se registra nada y no hay cuenta que crear.
Sin registro, sin límites y sin marca de agua en nada de lo que copies.