Codificações de caracteres em HTML - Character encodings in HTML

Embora o Hypertext Markup Language ( HTML ) esteja em uso desde 1991, o HTML 4.0 de dezembro de 1997 foi a primeira versão padronizada em que os caracteres internacionais receberam um tratamento razoavelmente completo. Quando um documento HTML inclui caracteres especiais fora do intervalo de ASCII de sete bits , dois objetivos devem ser considerados: a integridade das informações e a exibição universal do navegador .

Especificando a codificação de caracteres do documento

Existem várias maneiras de especificar qual codificação de caracteres é usada no documento. Primeiro, o servidor da web pode incluir a codificação de caracteres ou " charset" no cabeçalho do protocolo de transferência de hipertexto (HTTP) Content-Type, que normalmente seria assim:

Content-Type: text/html; charset=ISO-8859-4

Este método fornece ao servidor HTTP uma maneira conveniente de alterar a codificação do documento de acordo com a negociação de conteúdo ; certo software de servidor HTTP pode fazer isso, por exemplo, Apache com o módulo mod_charset_lite .

Para HTML, é possível incluir essas informações dentro do headelemento próximo ao topo do documento:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

HTML5 também permite que a seguinte sintaxe signifique exatamente o mesmo:

<meta charset="utf-8">

Os documentos XHTML têm uma terceira opção: expressar a codificação de caracteres por meio da declaração XML , da seguinte maneira:

<?xml version="1.0" encoding="ISO-8859-1"?>

Como a codificação de caracteres não pode ser conhecida até que essa declaração seja analisada, pode haver um problema em saber qual codificação é usada para a declaração em si. O princípio principal é que a declaração deve ser codificada em ASCII puro e, portanto (se a declaração estiver dentro do arquivo), a codificação precisa ser uma extensão ASCII . Para permitir codificações incompatíveis com ASCII, os navegadores devem ser capazes de analisar as declarações em tais codificações. Exemplos de tais codificações são UTF-16BE e UTF-16LE .

Algoritmo de detecção de codificação

No HTML5, o conjunto de caracteres recomendado é UTF-8 . Um "algoritmo de detecção de codificação" é definido na especificação para determinar a codificação de caracteres do documento com base em várias fontes de entrada, incluindo:

  1. Instruções explícitas do usuário
  2. Uma metatag explícita nos primeiros 1024 bytes do documento
  3. Uma marca de ordem de byte nos primeiros três bytes do documento
  4. O tipo de conteúdo HTTP ou outras informações da camada de transporte
  5. Análise dos bytes do documento procurando sequências específicas ou intervalos de valores de bytes e outros mecanismos de detecção provisória.

Caracteres fora do intervalo ASCII imprimível (32 a 126) geralmente aparecem incorretamente. Isso apresenta poucos problemas para usuários que falam inglês , mas outros idiomas regularmente - em alguns casos, sempre - exigem caracteres fora desse intervalo. Em ambientes de idioma chinês, japonês e coreano ( CJK ), onde há várias codificações multibyte diferentes em uso, a detecção automática também é frequentemente empregada. Finalmente, os navegadores geralmente permitem que o usuário substitua manualmente o rótulo do conjunto de caracteres incorreto .

É cada vez mais comum que sites multilíngues e sites em idiomas não ocidentais usem UTF-8 , que permite o uso da mesma codificação para todos os idiomas. UTF-16 ou UTF-32 , que também podem ser usados ​​para todas as linguagens, são menos amplamente usados ​​porque podem ser mais difíceis de manusear em linguagens de programação que assumem uma codificação de superconjunto ASCII orientada a bytes e são menos eficientes para texto com uma alta frequência de caracteres ASCII, que geralmente é o caso de documentos HTML.

A exibição bem-sucedida de uma página não é necessariamente uma indicação de que sua codificação foi especificada corretamente. Se o criador e o leitor da página estiverem assumindo alguma codificação de caracteres específica da plataforma e o servidor não enviar nenhuma informação de identificação, o leitor verá a página como o criador pretendia, mas outros leitores em plataformas diferentes ou com idiomas nativos diferentes não verá a página como pretendido.

Codificações permitidas

O WHATWG Encoding Standard, referenciado por padrões HTML recentes (o WHATWG HTML Living Standard atual, bem como o W3C HTML 5.0 e 5.1 anteriormente concorrente ) especifica uma lista de codificações que os navegadores devem suportar. Os padrões HTML proíbem o suporte de outras codificações. O Padrão de Codificação estipula ainda que novos formatos, novos protocolos (mesmo quando formatos existentes são usados) e autores de novos documentos são obrigados a usar UTF-8 exclusivamente.

Além do UTF-8, as seguintes codificações estão explicitamente listadas no próprio padrão HTML, com referência ao Padrão de Codificação:

As seguintes codificações adicionais estão listadas no Padrão de Codificação e, portanto, o suporte para elas também é necessário:

As seguintes codificações são listadas como exemplos explícitos de codificações proibidas:

O padrão também define um decodificador de "substituição", que mapeia todo o conteúdo rotulado como certas codificações para o caractere de substituição ( ), recusando-se a processá-lo. Isso tem o objetivo de prevenir ataques (por exemplo, cross site scripting ) que podem explorar uma diferença entre o cliente e o servidor em quais codificações são suportadas, a fim de mascarar conteúdo malicioso. Embora a mesma preocupação de segurança se aplique a ISO-2022-JP e UTF-16 , que também permitem que sequências de bytes ASCII sejam interpretadas de forma diferente, essa abordagem não foi considerada viável para eles, uma vez que são comparativamente mais usados ​​em conteúdo implantado. As seguintes codificações recebem este tratamento:

Referências de personagens

Além das codificações de caracteres nativos, os caracteres também podem ser codificados como referências de caracteres , que podem ser referências de caracteres numéricos ( decimais ou hexadecimais ) ou referências de entidades de caracteres . As referências de entidade de caractere também são às vezes chamadas de entidades nomeadas ou entidades HTML para HTML. O uso de referências de caracteres por HTML deriva de SGML .

Referências de caracteres HTML

Uma referência de caractere numérico em HTML refere-se a um caractere por seu ponto de código Unicode / Conjunto de caracteres universais e usa o formato

&#nnnn;

ou

&#xhhhh;

onde nnnn é o ponto de código na forma decimal e hhhh é o ponto de código na forma hexadecimal . O x deve ser minúsculo em documentos XML. O nnnn ou hhhh pode ser qualquer número de dígitos e pode incluir zeros à esquerda. O hhhh pode misturar maiúsculas e minúsculas, embora maiúsculas seja o estilo usual.

Nem todos os navegadores da web ou clientes de e - mail usados ​​por destinatários de documentos HTML ou editores de texto usados ​​por autores de documentos HTML serão capazes de processar todos os caracteres HTML. A maioria dos softwares modernos é capaz de exibir a maioria ou todos os caracteres do idioma do usuário e desenhará uma caixa ou outro indicador claro para os caracteres que eles não podem processar.

Para códigos de 0 a 127, o conjunto de padrões ASCII de 7 bits original , a maioria desses caracteres pode ser usada sem uma referência de caractere. Códigos de 160 a 255 podem ser criados usando nomes de entidade de personagem . Apenas alguns códigos de numeração mais alta podem ser criados usando nomes de entidade, mas todos podem ser criados por referência de caractere de número decimal.

As referências de entidade de caractere também podem ter o formato em que nome é uma string alfanumérica com distinção entre maiúsculas e minúsculas. Por exemplo, "λ" também pode ser codificado como em um documento HTML. As referências de entidade de caráter , , e são predefinidas no HTML e SGML, porque , , e já são utilizados para delimitar marcação. Notavelmente, isso não incluía a entidade XML (') anterior ao HTML5 . Para obter uma lista de todas as referências de entidades de caracteres HTML nomeadas junto com as versões nas quais foram introduzidas, consulte Lista de referências de entidades de caracteres XML e HTML . &name;&lambda;&lt;&gt;&quot;&amp;<>"&&apos;

O uso desnecessário de referências de caracteres HTML pode reduzir significativamente a legibilidade do HTML. Se a codificação de caracteres para uma página da web for escolhida de maneira adequada, as referências de caracteres HTML geralmente são necessárias apenas para caracteres delimitadores de marcação, conforme mencionado acima, e para alguns caracteres especiais (ou nenhum se for usada uma codificação Unicode nativa como UTF-8 ) O escape incorreto de entidade HTML também pode abrir vulnerabilidades de segurança para ataques de injeção, como scripts entre sites . Se os atributos HTML forem deixados sem aspas, certos caracteres, principalmente espaços em branco , como espaço e tabulação, devem ser escapados usando entidades. Outras linguagens relacionadas ao HTML têm seus próprios métodos de caracteres de escape.

Referências de caracteres XML

Ao contrário do HTML tradicional, com sua grande variedade de referências de entidades de caracteres, em XML existem apenas cinco referências de entidades de caracteres predefinidas. Eles são usados ​​para escapar caracteres que são sensíveis à marcação em certos contextos:

  • &amp; → & (e comercial , U + 0026)
  • &lt; → <(sinal de menor que, U + 003C)
  • &gt; →> (sinal de maior que, U + 003E)
  • &quot; → "(aspas, U + 0022)
  • &apos; → '(apóstrofo, U + 0027)

Todas as outras referências de entidade de caractere devem ser definidas antes que possam ser usadas. Por exemplo, o uso de &eacute;(que dá é, latim E minúsculo com acento agudo, U + 00E9 em Unicode) em um documento XML gerará um erro, a menos que a entidade já tenha sido definida. XML também requer que as xreferências numéricas hexadecimais estejam em minúsculas: por exemplo, em &#xA1bvez de &#XA1b. XHTML , que é um aplicativo XML, suporta o conjunto de entidades HTML, junto com as entidades predefinidas de XML.

Veja também

Referências

links externos