Escolha e uso de codificação de caracteres

Público alvo: Autores XHTML/HTML (usando editores ou scripts), desenvolvedores de scripts (PHP, JSP, etc.), criadores de CSS, gerentes de projetos para web e qualquer iniciante necessitando de informações introdutórias relativas a escolha e aplicação de codificação de caracteres.

Tradução atualizada:

Pergunta

Qual codificação de caracteres devo usar e como aplicá-la ao conteúdo que estou criando?

Conteúdo é composto de uma sequência de caracteres. Caracteres representam letras do alfabeto, pontuação, etc. Conteúdos são armazenados em um computador como uma sequência de bytes, que são valores númericos. Em alguns casos um simples caractere é representado por mais de um byte. Tal como os códigos usados em espionagem a maneira como uma sequência de bytes é convertida em caracteres depende do formato como o conteúdo foi codificado. Nesse contexto tal formato é denominado codificação de caracteres.

Esse artigo informa como escolher e aplicar uma codificação de caracteres para o seu conteúdo, ou seja, como criar um documento devidamente codificado.

Para mais informações sobre caracteres e codificação de caracteres ver o artigo Codificação de caracteres para iniciantes.

Resposta

Escolhendo codificação

Escolha UTF-8 para qualquer conteúdo e considere converter para UTF-8 conteúdos existentes codificados em formatos diferentes.

Se não for possível usar codificação Unicode, certifique-se do suporte pelos navegadores mais usados para a codificação que você escolheu e certifique-se também que a codificação escolhida não consta da lista de codificações a serem evitadas conforme prescrito pelas especificações atuais.

Verifique se sua escolha não será afetada pelas configurações HTTP do servidor.

Usando codificação para seu conteúdo

Autores de conteúdos devem declarar codificação de caracteres em suas páginas usando um dos métodos descritos em Declarando codicação de caracteres em HTML.

É importante saber e levar em conta que simplesmente declarar a codificação de caracteres no documento ou no servidor não é suficiente; faz-se necessário e indispensável que se salve o texto na mesma codificação que foi declarada para que ela seja aplicada ao conteúdo. (A declaração no documento destina-se a fornecer ao navegador uma indicação de como interpretar a sequência de bytes adotada na armazenagem do texto).

O artigo Configurando codificação em aplicação de autoria para web fornece informações detalhadas de como declarar e salvar codificações em vários editores.

Se você puder, configure UTF-8 como a codificação padrão para novos documento no seu editor. A figura a seguir mostra como definir a codificação padrão para novos documentos no Dreamweaver.

No Dreamweaver as preferências para novos documentos permitem configurar a codificação padrão.

Pode ainda haver a necessidade de se verificar se o servidor está servindo os documentos com a declaração HTTP apropriada, pois ela sobrescreve a declaração definida no documento (ver adiante).

É importante certificar-se de que os vários componentes de um sistema são capazes de se comunicar entre si. Páginas web devem ser capazes de se comunicar com scripts de back-end, banco de dados, etc. Todos estes componentes funcionam de forma apropriada, também, com a codificação UTF-8. Para uma descrição detalhada de uma série de itens a considerar neste assunto consulte o artigo Migrando para Unicode.

Detalhes

Por que usar UTF-8?

Uma página HTML pode ter apenas uma codificação de caracteres. Não é possível codificar diferentes partes de uma página em diferentes codificações.

A codificação baseada em Unicode, tal como UTF-8, oferece suporte para vários idiomas e assim sendo admite páginas e formulários em qualquer combinação de idiomas. Isso dispensa a necessidade de se criar uma lógica no servidor capaz de determinar a codificação para cada página servida ou para cada conjunto de dados recebidos de um formulário. Fica significantemente reduzida a complexidade própria do gerenciamento de um site ou aplicação multi-idiomas.

A codificação Unicode, mais do que qualquer outra codificação, permite que muito mais idiomas sejam usados em uma única página.

Nos dias atuais praticamente não existem barreiras para o uso de Unicode. Em janeiro de 2012 o Google informou que mais de 60% da Web está usando UTF-8. Se forem consideradas as páginas codificadas em ASCII (lembrando que ASCII é um subconjunto de UTF-8) aquele percentual sobe para 80%.

Em Unicode existem três diferentes codificações de caracteres: UTF-8, UTF-16 e UTF-32. Destas três somente UTF-8 deve ser usada para conteúdo Web. A especificação para a HTML5 diz "Recomenda-se que os autores usem UTF-8. Validadores deverão desaconselhar os autores a usar codificações legadas. Ferramentas de autoria devem ser configuradas por padrão para uso de UTF-8 para novos documentos."

Notar, particularmente, que todo caractere ASCII em UTF-8 usa exatamente os mesmos bytes da codificação em ASCII, fato que em muitos casos viabiliza a interoperabilidade e a retro-compatibilidade.

Considerando o HTTP header

Qualquer declaração de caracteres constante do HTTP header sobrescreve a declaração constante na página. Se o HTTP header declara uma codificação diferente daquela que você escolheu para seu conteúdo isso irá lhe causar problemas a não ser que você seja capaz de alterar as configurações do servidor.

É provável que você não tenha controle sobre as declarações vindas no HTTP header. Neste caso entre em contato com o responsável pelo servidor e peça ajuda. Por outro lado existem mecanismos capazes de solucionar o problema quando seu acesso ao servidor é limitado ou está gerando páginas dinamicamente. Por exemplo, consulte Configurando a codificação de caracteres no HTTP header para informações de como configurar codificação tanto localmente para um conjunto de arquivos no servidor como para conteúdos gerados dinamicamente.

Depois de usar um dos métodos descritos para configurar a codificação no cabeçalho HTTP você deverá verificar se o HTTP header está declarando a codificação de caracteres correta. Use a ferramenta W3C Internationalization Checker que informa a codificação, caso ela conste do HTTP header. Outra alternativa é descrita no artigo Verificando HTTP Headers que aponta para outras ferramenta de verificação das informações passadas pelo servidor com respeito à codificação de caracteres.

E se eu não puder usar UTF-8?

Neste caso você deverá escolher uma codificação a partir de um conjunto limitado de nomes de codificação e que assegure o máximo de interoperabilidade e legibilidade do seu conteúdo bem como a reduza os riscos à vulnerabilidade e segurança.

Consulte o IANA registry para encontrar os nomes de codificação. O IANA registry costuma apresentar diferentes nomes para uma mesma codificação.Nestes casos escolha o nome que vem rotulado como 'preferred' (preferido).

A nova especificação Encoding fornece uma lista de codificações que vem sendo testada nos navegadores atuais. A lista encontra-se em uma tabela na seção denominada Encodings. É melhor usar os nomes de codificação que se encontram na coluna esquerda daquela tabela.

Contudo, convém notar que o simples fato de um nome de codificação constar de uma das listas citadas não significa necessariamente que aquela codificação seja apropriada para uso. Ver a seção a seguir que trata das codificações a serem evitadas.

Codificações a evitar

A especificação para a HTML5 fornece uma lista de várias codificações a serem evitadas.

Não se deve usar, em documentos, as codificações JIS_C6226-1983, JIS_X0212-1990, HZ-GB-2312, JOHAB (Windows code page 1361), codificações baseadas em ISO-2022, ou EBCDIC. Estas codificações permitem que códigos para pontuação ASCII representem caracteres não ASCII, o que acarreta riscos para a segurança.

Não se deve usar, em documentos, as codificações CESU-8, UTF-7, BOCU-1, ou SCSU pois não se destinam a conteúdos Web e a especificação para a HTML5 proibe os navegadores de reconhecer estas codificações.

A especificação desencoraja o uso de UTF-16, assim como o uso de UTF-32 é 'fortemente desencorajado'.

Outras codificações de caracteres listadas na especificação Encoding devem ser evitadas. Isto inclui as codificações Big5 e EUC-JP que apresentam problemas relacionados a interoperabilidade. ISO-8859-8 (codificação hebráica para ordenação visual de texto) deve ser evitada e substituida por codificação capaz de ordenação lógica de texto (ou seja, UTF-8 ou ISO-8859-8-i).

A codificação replacement listada na especificação Encoding não é uma codificação em si; é um fallback que mapeia cada octeto para um código de ponto Unicode U+FFFD REPLACEMENT CHARACTER. Obviamente isso não se presta para transmitir dados.

A codificação x-user-defined é uma codificação do tipo byte único cuja parte baixa é ASCII e a parte alta é mapeada dentro da Unicode Private Use Area (PUA). Tal como para toda PUA em geral deve se evitar o uso dessa codificação na Internet por problemas causados a interoperabilidade e ao uso a longo prazo.

Leitura complementar