FreeToGenerate.com

Cuarenta codificaciones, 228 nombres para ellas y ninguna cuarenta y uno.

Decodifica unos bytes

iso-8859-1resuelve a windows-1252

13 · leído como hexadecimal

Los mismos bytes con cuatro etiquetas

Estas cuatro etiquetas nombran cuatro cosas distintas y resuelven a una sola codificación, así que las cuatro filas salen idénticas por construcción.

El estándar, en cifras

codificaciones
40
etiquetas
228
vigente
1
heredadas
39
etiquetas en windows-1252
17

Esta lista no puede crecer. Sección 4.2: la tabla enumera todas las codificaciones y etiquetas que un agente de usuario debe admitir, y no debe admitir ninguna otra.

Un navegador lee las 40 y escribe exactamente una. TextEncoder no acepta argumento y su codificación está especificada como utf-8; incluso las URL y el envío de formularios recurren a UTF-8 para replacement y para las dos UTF-16.

Las 40 codificaciones

40 visibles
CodificaciónGrupoEtiquetas
UTF-8La codificaciónunicode-1-1-utf-8 unicode11utf8 unicode20utf8 utf-8 utf8 x-unicode20utf8
IBM866Heredadas de un byte866 cp866 csibm866 ibm866
ISO-8859-2Heredadas de un bytecsisolatin2 iso-8859-2 iso-ir-101 iso8859-2 iso88592 iso_8859-2 iso_8859-2:1987 l2 latin2
ISO-8859-3Heredadas de un bytecsisolatin3 iso-8859-3 iso-ir-109 iso8859-3 iso88593 iso_8859-3 iso_8859-3:1988 l3 latin3
ISO-8859-4Heredadas de un bytecsisolatin4 iso-8859-4 iso-ir-110 iso8859-4 iso88594 iso_8859-4 iso_8859-4:1988 l4 latin4
ISO-8859-5Heredadas de un bytecsisolatincyrillic cyrillic iso-8859-5 iso-ir-144 iso8859-5 iso88595 iso_8859-5 iso_8859-5:1988
ISO-8859-6Heredadas de un bytearabic asmo-708 csiso88596e csiso88596i csisolatinarabic ecma-114 iso-8859-6 iso-8859-6-e iso-8859-6-i iso-ir-127 iso8859-6 iso88596 iso_8859-6 iso_8859-6:1987
ISO-8859-7Heredadas de un bytecsisolatingreek ecma-118 elot_928 greek greek8 iso-8859-7 iso-ir-126 iso8859-7 iso88597 iso_8859-7 iso_8859-7:1987 sun_eu_greek
ISO-8859-8Heredadas de un bytecsiso88598e csisolatinhebrew hebrew iso-8859-8 iso-8859-8-e iso-ir-138 iso8859-8 iso88598 iso_8859-8 iso_8859-8:1988 visual
ISO-8859-8-IHeredadas de un bytecsiso88598i iso-8859-8-i logical
ISO-8859-10Heredadas de un bytecsisolatin6 iso-8859-10 iso-ir-157 iso8859-10 iso885910 l6 latin6
ISO-8859-13Heredadas de un byteiso-8859-13 iso8859-13 iso885913
ISO-8859-14Heredadas de un byteiso-8859-14 iso8859-14 iso885914
ISO-8859-15Heredadas de un bytecsisolatin9 iso-8859-15 iso8859-15 iso885915 iso_8859-15 l9
ISO-8859-16Heredadas de un byteiso-8859-16
KOI8-RHeredadas de un bytecskoi8r koi koi8 koi8-r koi8_r
KOI8-UHeredadas de un bytekoi8-ru koi8-u
macintoshHeredadas de un bytecsmacintosh mac macintosh x-mac-roman
windows-874Heredadas de un bytedos-874 iso-8859-11 iso8859-11 iso885911 tis-620 windows-874
windows-1250Heredadas de un bytecp1250 windows-1250 x-cp1250
windows-1251Heredadas de un bytecp1251 windows-1251 x-cp1251
windows-1252Heredadas de un byteansi_x3.4-1968 ascii cp1252 cp819 csisolatin1 ibm819 iso-8859-1 iso-ir-100 iso8859-1 iso88591 iso_8859-1 iso_8859-1:1987 l1 latin1 us-ascii windows-1252 x-cp1252
windows-1253Heredadas de un bytecp1253 windows-1253 x-cp1253
windows-1254Heredadas de un bytecp1254 csisolatin5 iso-8859-9 iso-ir-148 iso8859-9 iso88599 iso_8859-9 iso_8859-9:1989 l5 latin5 windows-1254 x-cp1254
windows-1255Heredadas de un bytecp1255 windows-1255 x-cp1255
windows-1256Heredadas de un bytecp1256 windows-1256 x-cp1256
windows-1257Heredadas de un bytecp1257 windows-1257 x-cp1257
windows-1258Heredadas de un bytecp1258 windows-1258 x-cp1258
x-mac-cyrillicHeredadas de un bytex-mac-cyrillic x-mac-ukrainian
GBKChino simplificado (heredadas)chinese csgb2312 csiso58gb231280 gb2312 gb_2312 gb_2312-80 gbk iso-ir-58 x-gbk
gb18030Chino simplificado (heredadas)gb18030
Big5Chino tradicional (heredadas)big5 big5-hkscs cn-big5 csbig5 x-x-big5
EUC-JPJaponés (heredadas)cseucpkdfmtjapanese euc-jp x-euc-jp
ISO-2022-JPJaponés (heredadas)csiso2022jp iso-2022-jp
Shift_JISJaponés (heredadas)csshiftjis ms932 ms_kanji shift-jis shift_jis sjis windows-31j x-sjis
EUC-KRCoreano (heredadas)cseuckr csksc56011987 euc-kr iso-ir-149 korean ks_c_5601-1987 ks_c_5601-1989 ksc5601 ksc_5601 windows-949
replacementVarias (heredadas)csiso2022kr hz-gb-2312 iso-2022-cn iso-2022-cn-ext iso-2022-kr replacement
UTF-16BEVarias (heredadas)unicodefffe utf-16be
UTF-16LEVarias (heredadas)csunicode iso-10646-ucs-2 ucs-2 unicode unicodefeff utf-16 utf-16le
x-user-definedVarias (heredadas)x-user-defined

Los nombres, las etiquetas y los grupos salen del propio encodings.json del Encoding Standard de WHATWG. La decodificación la hace tu navegador, que implementa ese mismo estándar.

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

  1. 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.
  2. 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.
  3. 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.