Codificações de caracteres em HTML
Enquanto a linguagem de marcação de hipertexto (HTML) está 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, vale a pena considerar dois objetivos: a integridade da informação e a exibição universal do navegador.
Especificando a codificação de caracteres do documento
Existem duas maneiras gerais de especificar qual codificação de caracteres é usada no documento.
Primeiro, o servidor web pode incluir a codificação de caracteres ou "charset
" no cabeçalho Content-Type
do Hypertext Transfer Protocol (HTTP), que normalmente se pareceria com isto:
Content-Type: texto/html; charset=utf-8
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 fazê-lo, por exemplo Apache com o módulo mod_charset_lite
.
Em segundo lugar, uma declaração pode ser incluída no próprio documento.
Para HTML é possível incluir esta informação dentro do elemento head
próximo ao topo do documento:
<meta http-equiv= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ="Conteúdo-Tipo" conteúdo= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ="texto/html; charset=utf-8">
HTML5 também permite que a seguinte sintaxe signifique exatamente o mesmo:
<meta charset= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ="utf-8">
Documentos XHTML possuem uma terceira opção: expressar a codificação de caracteres via declaração XML, como segue:
Com esta segunda abordagem, como a codificação de caracteres não pode ser conhecida até que a declaração seja analisada, há um problema em saber qual codificação de caractere é usada no documento até e incluindo a própria declaração. Se a codificação de caracteres for uma extensão ASCII, o conteúdo até e incluindo a própria declaração deve ser ASCII puro e isso funcionará corretamente. Para codificações de caracteres que não são extensões ASCII (ou seja, não um superconjunto de ASCII), como UTF-16BE e UTF-16LE, um processador de HTML, como um navegador da Web, deve ser capaz de analisar a declaração em alguns casos por meio do uso de heurísticas.
Algoritmo de detecção de codificação
A partir do 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:
- Instrução de usuário explícita
- Uma meta tag explícita dentro dos primeiros 1024 bytes do documento
- Uma marca de ordem byte (BOM) nos três primeiros bytes do documento
- O conteúdo HTTP-Tipo ou outras informações da camada de transporte
- Análise dos bytes do documento que procuram sequências ou intervalos específicos de valores byte, e outros mecanismos de detecção tentativa.
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 o rótulo do conjunto de caracteres incorreto manualmente também.
É 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 todos os idiomas, são menos 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 visualizaçã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 diferentes plataformas ou com diferentes idiomas nativos não verão a página como pretendido.
Codificações permitidas
O padrão de codificação WHATWG, referenciado por padrões HTML recentes (o atual WHATWG HTML Living Standard, bem como o W3C HTML 5.0 e 5.1 anteriormente concorrentes) 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 devem usar exclusivamente UTF-8.
Além do UTF-8, as seguintes codificações são explicitamente listadas no próprio padrão HTML, com referência ao Padrão de Codificação:
- ISO-8859-2
- ISO-8859-7
- ISO-8859-8
- Windows-874
- Windows-1250
- Windows-1251
- Windows-1252
- Windows-1254
- Windows-1255
- Windows-1256
- Windows-1257
- Windows-1258
- GB 18030
- Grande.
- Shift JIS
- ISO-2022-JP
- EUC-KR
- UTF-16BE
- UTF-16
- x-usuário definido
- ^ Também especificado para
TIS-620
,ISO-8859-11
e rótulos relacionados. - ^ Também especificado para
ASCII
,ISO-8859-1
e rótulos relacionados. - ^ Também especificado para
ISO-8859-9
e rótulos relacionados. - ^ Especificado com 0xA3A0 como uma codificação duplicada do espaço ideográfico (U+3000) por razões de compatibilidade, e como tal, excluindo U+E5E5 (um caractere de uso privado). Além disso, especificado com 0x80 aceito como uma codificação alternativa do sinal do euro (U+20AC; ver Windows-936). Caso contrário, segue os mapeamentos da norma 2005.
- ^ Caráter suplementar de Hong Kong Definir variante, embora a maioria das extensões HKSCS (aqueles com bytes de chumbo menos de 0xA1) não são incluídos pelo codificador, apenas pelo decodificador.
- ^ A especificação inclui extensões IBM e NEC (ver Windows-31J).
- ^ A especificação usa o mesmo índice usado para Shift JIS (independentemente do alcance), ou seja, inclui extensões NEC. kana de meia largura é convertido em largura total pelo codificador, mas aceito usando uma sequência de escape (ESC 0x28 0x49) pelo decodificador. Shift Out e Shift In (0x0E e 0x0F) são excluídos inteiramente para evitar ataques.
- ^ Na verdade Unified Hangul Code, que é um superset que cobre todo o bloco Hangul Syllables.
- ^ Especificado apenas para decodificação; os envios de formulário de documentos codificados UTF-16 devem ser codificados no UTF-8.
- ^ Para compatibilidade com conteúdo implantado, também especificado para a planície
UTF-16
etiqueta, embora uma marca de ordem byte (BOM), se presente, tem prioridade sobre qualquer etiqueta. Especificado apenas para decodificação; os envios de formulário de documentos codificados UTF-16 devem ser codificados no UTF-8. - ^ Mapas 0x00 até 0x7F para U+0000 através de U+007F, e 0x80 até 0xFF para U+F780 através de U+F7FF (um intervalo de Área de Uso Privado), de modo que os baixos 8 bits do ponto de código sempre correspondem ao byte original.
As seguintes codificações adicionais estão listadas no Padrão de Codificação e, portanto, o suporte para elas também é necessário:
- Página do código 866
- ISO-8859-3
- ISO-8859-4
- ISO-8859-5
- ISO-8859-6
- ISO-8859-8-I
- ISO-8859-10
- ISO-8859-13
- ISO-8859-14
- ISO-8859-15
- ISO-8859-16
- KOI8-R
- KOI8-U / KOI8-RU
- Mac OS Roman
- Windows-1253
- Mac OS Cyrillic
- GBK
- EUC-JP
- ^ Usa o mesmo codificador e decodificador como ISO-8859-8, mas não está sujeito ao comportamento de ordem visual que é usado para documentos rotulados como ISO-8859-8.
- ^ Título KOI8-U e especificado para ambos
KOI8-U
eKOI8-RU
etiquetas, mas segue KOI8-RU (i.e. inclui Ў ⌘/ў). - ^ Também especificado para
GB2312
e rótulos relacionados. Lidar com o mesmo GB 18030 para fins de decodificação. Para fins de codificação, rotulagem como GBK (ou GB 2312) exclui códigos de quatro bytes e favorece a representação de um byte 0x80 para U+20AC. - ^ A especificação utiliza o mesmo índice utilizado para o Shift JIS (na medida em que está ao alcance do conjunto de código EUC 1), ou seja, inclui extensões NEC. JIS X 0212 está incluído apenas para decodificação.
As seguintes codificações são listadas como exemplos explícitos de codificações proibidas:
- CESÍ87
- UTF-7
- BOCU-1
- SCSU
- EBCDIC
- UTF-32
O padrão também define uma "substituição" decodificador, que mapeia todo o conteúdo rotulado como certas codificações para o caractere de substituição (�), recusando-se a processá-lo. O objetivo é evitar 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 para mascarar o 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 maneira diferente, essa abordagem não foi considerada viável para eles, pois são comparativamente mais usados em conteúdo implantado. As seguintes codificações recebem esse tratamento:
- ISO-2022-KR
- ISO-2022-CN
- ISO-2022-CN-EXT
- HZ-GB-2312
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 (decimal ou hexadecimal) ou entidade de caractere referências. As referências de entidades de caracteres também são às vezes chamadas de entidades nomeadas ou entidades HTML para HTML. O uso de referências de caracteres do HTML deriva do SGML.
Referências de caracteres HTML
Uma referência de caractere numérico em HTML refere-se a um caractere por seu Conjunto de Caracteres Universal/Unicode ponto de código e usa o formato
nnnn;
ou
hhhh;
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 receptores de documentos HTML, ou editores de texto usados por autores de documentos HTML, serão capazes de renderizar todos os caracteres HTML. A maioria dos softwares modernos é capaz de exibir a maioria ou todos os caracteres do idioma do usuário e desenha uma caixa ou outro indicador claro para os caracteres que não podem ser renderizados.
Para códigos de 0 a 127, o conjunto padrão 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 todos criados usando nomes de entidades de caracteres. 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 entidades de caracteres também podem ter o formato &name;
onde name é uma string alfanumérica que diferencia maiúsculas de minúsculas. Por exemplo, "λ" também pode ser codificado como λ
em um documento HTML. A entidade de caractere faz referência a <
, >
, "
e &
são predefinidos em HTML e SGML, porque <
, >
, "
e &
já são usados para delimitar a marcação. Isso notavelmente não incluía a entidade '
(') do XML antes do HTML5. Para obter uma lista de todas as referências de entidades de caracteres HTML nomeadas junto com as versões nas quais elas foram introduzidas, consulte Lista de referências de entidades de caracteres HTML e XML.
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 apropriadamente, 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 uma codificação Unicode nativa como UTF-8 for usada). 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 possuem seus próprios métodos de escape de caracteres.
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 de caracteres que são sensíveis à marcação em determinados contextos:
&
→ & (amp; período;<
→ < (sem sinal, U+003C)>
→ > (maior que sinal, U+003E)"
→ " (marca de citações, U+0022)'
→ ' (apostrofe, U+0027)
Todas as outras referências de entidades de caracteres devem ser definidas antes de serem usadas. Por exemplo, o uso de é
(que dá é, E minúsculo latino com acento agudo, U+00E9 em Unicode) em um documento XML gerará um erro, a menos que a entidade já tenha sido definiram. O XML também requer que o x
nas referências numéricas hexadecimais esteja em letras minúsculas: por exemplo, ਛ
em vez de ਛ
. XHTML, que é um aplicativo XML, suporta o conjunto de entidades HTML, juntamente com as entidades predefinidas de XML.
Contenido relacionado
Sistema de Sinalização de Rede Privada Digital
Dados Gerais Nova
Televisão digital