FreeToGenerate.com

Quarenta codificações, 228 nomes para elas e nenhuma quadragésima primeira.

Decodifique alguns bytes

iso-8859-1resolve para windows-1252

13 · lido como hexadecimal

Os mesmos bytes sob quatro rótulos

Estes quatro rótulos nomeiam quatro coisas diferentes e resolvem para uma só codificação, então as quatro linhas saem idênticas por construção.

O padrão, em números

codificações
40
rótulos
228
atual
1
legadas
39
rótulos em windows-1252
17

Esta lista não pode crescer. Seção 4.2: a tabela lista todas as codificações e rótulos que um agente de usuário deve suportar, e ele não deve suportar nenhum outro.

Um navegador lê as 40 e escreve exatamente uma. TextEncoder não aceita argumento e sua codificação é especificada como utf-8; até URLs e envio de formulários recorrem a UTF-8 para replacement e para as duas UTF-16.

As 40 codificações

40 à vista
CodificaçãoGrupoRótulos
UTF-8A codificaçãounicode-1-1-utf-8 unicode11utf8 unicode20utf8 utf-8 utf8 x-unicode20utf8
IBM866Legadas de um byte866 cp866 csibm866 ibm866
ISO-8859-2Legadas de um bytecsisolatin2 iso-8859-2 iso-ir-101 iso8859-2 iso88592 iso_8859-2 iso_8859-2:1987 l2 latin2
ISO-8859-3Legadas de um bytecsisolatin3 iso-8859-3 iso-ir-109 iso8859-3 iso88593 iso_8859-3 iso_8859-3:1988 l3 latin3
ISO-8859-4Legadas de um bytecsisolatin4 iso-8859-4 iso-ir-110 iso8859-4 iso88594 iso_8859-4 iso_8859-4:1988 l4 latin4
ISO-8859-5Legadas de um bytecsisolatincyrillic cyrillic iso-8859-5 iso-ir-144 iso8859-5 iso88595 iso_8859-5 iso_8859-5:1988
ISO-8859-6Legadas de um 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-7Legadas de um 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-8Legadas de um 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-ILegadas de um bytecsiso88598i iso-8859-8-i logical
ISO-8859-10Legadas de um bytecsisolatin6 iso-8859-10 iso-ir-157 iso8859-10 iso885910 l6 latin6
ISO-8859-13Legadas de um byteiso-8859-13 iso8859-13 iso885913
ISO-8859-14Legadas de um byteiso-8859-14 iso8859-14 iso885914
ISO-8859-15Legadas de um bytecsisolatin9 iso-8859-15 iso8859-15 iso885915 iso_8859-15 l9
ISO-8859-16Legadas de um byteiso-8859-16
KOI8-RLegadas de um bytecskoi8r koi koi8 koi8-r koi8_r
KOI8-ULegadas de um bytekoi8-ru koi8-u
macintoshLegadas de um bytecsmacintosh mac macintosh x-mac-roman
windows-874Legadas de um bytedos-874 iso-8859-11 iso8859-11 iso885911 tis-620 windows-874
windows-1250Legadas de um bytecp1250 windows-1250 x-cp1250
windows-1251Legadas de um bytecp1251 windows-1251 x-cp1251
windows-1252Legadas de um 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-1253Legadas de um bytecp1253 windows-1253 x-cp1253
windows-1254Legadas de um 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-1255Legadas de um bytecp1255 windows-1255 x-cp1255
windows-1256Legadas de um bytecp1256 windows-1256 x-cp1256
windows-1257Legadas de um bytecp1257 windows-1257 x-cp1257
windows-1258Legadas de um bytecp1258 windows-1258 x-cp1258
x-mac-cyrillicLegadas de um bytex-mac-cyrillic x-mac-ukrainian
GBKChinês simplificado (legadas)chinese csgb2312 csiso58gb231280 gb2312 gb_2312 gb_2312-80 gbk iso-ir-58 x-gbk
gb18030Chinês simplificado (legadas)gb18030
Big5Chinês tradicional (legadas)big5 big5-hkscs cn-big5 csbig5 x-x-big5
EUC-JPJaponês (legadas)cseucpkdfmtjapanese euc-jp x-euc-jp
ISO-2022-JPJaponês (legadas)csiso2022jp iso-2022-jp
Shift_JISJaponês (legadas)csshiftjis ms932 ms_kanji shift-jis shift_jis sjis windows-31j x-sjis
EUC-KRCoreano (legadas)cseuckr csksc56011987 euc-kr iso-ir-149 korean ks_c_5601-1987 ks_c_5601-1989 ksc5601 ksc_5601 windows-949
replacementDiversas (legadas)csiso2022kr hz-gb-2312 iso-2022-cn iso-2022-cn-ext iso-2022-kr replacement
UTF-16BEDiversas (legadas)unicodefffe utf-16be
UTF-16LEDiversas (legadas)csunicode iso-10646-ucs-2 ucs-2 unicode unicodefeff utf-16 utf-16le
x-user-definedDiversas (legadas)x-user-defined

Nomes, rótulos e grupos vêm do próprio encodings.json do Encoding Standard da WHATWG. A decodificação é feita pelo seu navegador, que implementa esse mesmo padrão.

Também disponível em: English · Español · Français · العربية

Codificação de caracteres: todos os charsets do navegador

A lista completa que um navegador deve suportar, um decodificador que roda no seu e o que cada rótulo realmente resolve.

O que é uma codificação de caracteres?

Um arquivo guarda bytes. Uma codificação de caracteres é o acordo que transforma esses bytes em letras: que o byte 0x41 é A, que os dois bytes 0xC3 0xA9 são é. Erre o acordo e vem o mojibake — os mesmos bytes lidos pela tabela errada, produzindo é onde deveria haver é.

Houve centenas desses acordos, um por idioma e por fabricante. A web os estreitou: o Encoding Standard da WHATWG lista exatamente 40 codificações e os 228 rótulos que as nomeiam, e é aquela raridade que é uma lista que não pode crescer. Ele diz nas próprias palavras: a tabela reúne todas as codificações e rótulos que um agente de usuário deve suportar, e ele não deve suportar nenhum outro. Uma das 40 é a atual. As outras 39 ficam sob títulos que começam pela palavra legadas.

Esse fechamento é o que separa esta lista de qualquer registro com que se pareça. Um registro anota o que existe e ganha linhas. Esta é um teto.

Como usar

  1. Coloque alguns bytes. Dígitos hexadecimais são lidos como bytes, então 93 77 6f 72 6c 64 94 são sete deles. Qualquer outra coisa é tratada como texto e codificada antes em UTF-8, porque UTF-8 é a única coisa que um navegador sabe codificar.
  2. Nomeie uma codificação. Vale qualquer um dos 228 rótulos, em qualquer caixa. Um rótulo não reconhecido é uma falha e não um retorno silencioso a outra coisa, que é o que o padrão exige.
  3. Leia a comparação abaixo. Os mesmos bytes são decodificados sob quatro rótulos diferentes que resolvem para uma só codificação, então as quatro linhas saem idênticas — e é justamente esse o ponto.

Não existe codificação ASCII, nem Latin-1

Peça ascii a um navegador e receba windows-1252. Peça us-ascii, iso-8859-1, latin1, cp819 ou ansi_x3.4-1968 e receba windows-1252 de novo. Dezessete dos 228 rótulos se empilham naquela linha, e nem ASCII nem ISO-8859-1 existem no padrão com nome próprio — enquanto ISO-8859-2 e ISO-8859-15 existem, o que faz da ausência uma decisão e não um descuido.

Importa porque windows-1252 não é ISO-8859-1. Decodificando todos os 256 valores de byte pelas duas definições, elas diferem em 27, e os 27 caem na faixa 0x80 a 0x9F, que a ISO-8859-1 preenche com códigos de controle invisíveis e a Microsoft preencheu com pontuação. O byte 0x80 é o símbolo do euro. De 0x91 a 0x94 estão as aspas curvas. 0x96 e 0x97 são o traço e o travessão. 0x85 são as reticências.

Ou seja, os caracteres em que as duas discordam são exatamente os que um processador de texto insere sem ser pedido, e por isso um documento salvo como Latin-1 e servido como Latin-1 continua exibindo as aspas certas: o navegador nunca esteve usando Latin-1. Cinco dos valores que a Microsoft deixou vazios permanecem como caracteres de controle em vez de virarem U+FFFD, então nada naquela faixa jamais falha ao decodificar.

Isso também limita o quanto se pode confiar que uma codificação de um byte seja total: entre as 28 codificações de um byte há 150 posições sem caractere algum, que decodificam para U+FFFD, espalhadas por nove delas. Que todo byte seja um caractere é uma suposição razoável e falsa.

Ler quarenta, escrever uma

Um navegador decodifica todas as 40. Codifica exatamente uma. O padrão fixa a propriedade encoding de um codificador de texto em utf-8 e não dá argumento nenhum ao construtor, então não há forma suportada de pedir que um navegador escreva Shift_JIS ou windows-1251. A seção 4.3 leva a mesma regra adiante: quando a análise de uma URL ou o envio de um formulário precisam de uma codificação de saída, replacement e as duas UTF-16 são reescritas para UTF-8 antes de qualquer escrita.

Uma entrada é mais estranha que as outras. A codificação chamada replacement não decodifica nada: qualquer entrada não vazia vira um único U+FFFD. Seis rótulos apontam para ela, cinco deles codificações reais e implantadas — ISO-2022-CN, ISO-2022-KR, HZ-GB-2312 e seus apelidos. O padrão diz claramente por quê: ela existe para impedir ataques que abusam do descompasso entre as codificações que um servidor suporta e as que um cliente suporta. A ISO-2022-JP sobreviveu à mesma poda apenas porque conteúdo demais depende dela.

E um rótulo responde a uma pergunta que as pessoas erram: utf-16, sem indicar a ordem dos bytes, significa little-endian. O rótulo unicode também.

O que esta página não consegue dizer

O decodificador aqui é o do seu navegador, não o nosso, e isso é deliberado: é a única implementação cuja resposta importa para você, e é aquela para a qual o padrão foi escrito. Também significa que o resultado pode diferir de outro ambiente. O Node, por exemplo, recusa a codificação replacement de saída, mesmo o padrão exigindo suporte a ela, então algo que decodifica aqui pode não decodificar num script.

Segundo, esta página diz o que um rótulo significa, não o que um arquivo é. Nada dentro de uma sequência de bytes diz qual codificação a produziu; adivinhar é um problema separado e bem mais difícil, e a resposta honesta para qualquer arquivo sob seu controle é convertê-lo para UTF-8 e parar de adivinhar.

Terceiro, este é um padrão da web. Bancos de dados, terminais e linguagens de programação implementam as próprias tabelas e nem sempre concordam. Comparadas byte a byte com os codecs do Python nas 28 codificações de um byte, 18 são idênticas e as demais diferem em 89 de 7.168 posições, quase sempre onde o Python recusa um byte que a Microsoft deixou indefinido e um navegador devolve um caractere de controle. Resta uma discordância real, em duas posições do KOI8-U, onde os dois projetos herdaram versões diferentes da mesma codificação.

Por que é grátis?

A tabela são alguns kilobytes que viajam com a página, e a decodificação é feita pelo navegador que você já tem. Nada do que você digita é enviado, nada é registrado e não há conta a criar.

Sem cadastro, sem limites e sem marca d'água em nada que você copiar.