Unicode e HTML - Unicode and HTML

As páginas da Web criadas usando linguagem de marcação de hipertexto ( HTML ) podem conter texto multilíngue representado com o conjunto de caracteres universais Unicode . A chave para a relação entre Unicode e HTML é a relação entre o "conjunto de caracteres do documento", que define o conjunto de caracteres que podem estar presentes em um documento HTML e atribui números a eles, e a "codificação externa de caracteres" ou "conjunto de caracteres ", usado para codificar um determinado documento como uma sequência de bytes.

No RFC 1866 , o padrão HTML 2.0 inicial, o conjunto de caracteres do documento era definido como ISO-8859-1. Ele foi estendido para ISO 10646 (que é basicamente equivalente ao Unicode) pela RFC 2070 . Não varia entre documentos de diferentes idiomas ou criados em diferentes plataformas. A codificação de caracteres externos é escolhida pelo autor do documento (ou o software que o autor usa para criar o documento) e determina como os bytes usados ​​para armazenar e / ou transmitir o mapa do documento para os caracteres do conjunto de caracteres do documento. Os caracteres não presentes na codificação de caracteres externa escolhida podem ser representados por referências de entidades de caracteres.

A relação entre Unicode e HTML tende a ser um tópico difícil para muitos profissionais de informática, autores de documentos e usuários da web . A representação precisa do texto em páginas da web de diferentes linguagens naturais e sistemas de escrita é complicada pelos detalhes da codificação de caracteres , sintaxe da linguagem de marcação , fonte e vários níveis de suporte por navegadores da web .

Caracteres de documento HTML

As páginas da Web são normalmente documentos HTML ou XHTML . Ambos os tipos de documentos consistem, a um nível fundamental, em personagens , que são grafemas e unidades semelhantes a grafemas, independentemente de como se manifestam em sistemas e redes de armazenamento informático .

Um documento HTML é uma sequência de caracteres Unicode. Mais especificamente, os documentos HTML 4.0 devem consistir em caracteres no conjunto de caracteres do documento HTML  : um repertório de caracteres em que cada caractere é atribuído a um ponto de código inteiro não negativo único . Esse conjunto é definido no DTD HTML 4.0 , que também estabelece a sintaxe (sequências de caracteres permitidas) que pode produzir um documento HTML válido. O conjunto de caracteres do documento HTML para HTML 4.0 consiste na maioria, mas não em todos, dos caracteres definidos em conjunto por Unicode e ISO / IEC 10646: o Conjunto de caracteres universais (UCS).

Como documentos HTML, um documento XHTML é uma sequência de caracteres Unicode. No entanto, um documento XHTML é um documento XML que, embora não tenha uma camada de abstração de "caractere de documento" explícito , depende de uma definição semelhante de caracteres permitidos que abrange a maioria, mas não todas, as definições de caracteres Unicode / UCS. Os conjuntos usados ​​por HTML e XHTML / XML são ligeiramente diferentes, mas essas diferenças têm pouco efeito no autor médio de documentos.

Independentemente de o documento ser HTML ou XHTML, quando armazenado em um sistema de arquivos ou transmitido pela rede, os caracteres do documento são codificados como uma sequência de octetos de bits ( bytes ) de acordo com uma codificação de caractere específica. Essa codificação pode ser um Formato de Transformação Unicode , como UTF-8 , que pode codificar diretamente qualquer caractere Unicode, ou uma codificação herdada, como Windows-1252 , que não pode. No entanto, mesmo ao usar codificações que não suportam todos os caracteres Unicode, o documento codificado pode fazer uso de referências de caracteres numéricos . Por exemplo, (☺) é usado para indicar um caractere de rosto sorridente no conjunto de caracteres Unicode. ☺

Codificação de caracteres

Para oferecer suporte a todos os caracteres Unicode sem recorrer a referências de caracteres numéricos, uma página da web deve ter uma codificação que cubra todo o Unicode. O mais popular é o UTF-8 , onde os caracteres ASCII , como letras inglesas, dígitos e alguns outros caracteres comuns são preservados inalterados em relação ao ASCII. Isso torna o código HTML (como <br> e </div>) inalterado em comparação com ASCII. Os caracteres fora do intervalo ASCII são armazenados em 2 a 4 bytes. Também é possível usar UTF-16, onde a maioria dos caracteres são armazenados como dois bytes com endianness variável , que é suportado por navegadores modernos, mas menos comumente usados.

Referências de caracteres numéricos

Para contornar as limitações das codificações legadas, o HTML é projetado de forma que seja possível representar caracteres de todo o Unicode dentro de um documento HTML usando uma referência de caractere numérica : uma sequência de caracteres que explicitamente explicam o ponto do código Unicode do personagem que está sendo representado. Uma referência de caractere assume a forma N , onde N é um número decimal para o ponto de código Unicode ou um número hexadecimal , caso em que deve ser precedido por . Os caracteres que compõem a referência de caractere numérico são universalmente representáveis ​​em todas as codificações aprovadas para uso na Internet. &#;x

O suporte para hexadecimal neste contexto é mais recente, então navegadores mais antigos podem ter problemas para exibir caracteres referenciados com números hexadecimais - mas eles provavelmente terão problemas para exibir caracteres Unicode acima do ponto de código 255 de qualquer maneira. Para garantir melhor compatibilidade com navegadores mais antigos, ainda é uma prática comum converter o ponto de código hexadecimal em um valor decimal (por exemplo, em &#21512; vez de &#x5408; ).

Entidades de personagem nomeadas

No HTML 4, há um conjunto padrão de 252 entidades de caracteres nomeados para caracteres - alguns comuns, outros obscuros - que não são encontrados em certas codificações de caracteres ou são sensíveis à marcação em alguns contextos (por exemplo, colchetes angulares e aspas). Embora qualquer caractere Unicode possa ser referenciado por seu ponto de código numérico, alguns autores de documentos HTML preferem usar essas entidades nomeadas, quando possível, pois são menos enigmáticas e eram mais bem suportadas pelos navegadores anteriores.

Entidades de caractere podem ser incluídas em um documento HTML por meio do uso de referências de entidade , que tomam a forma EntityName , onde EntityName é o nome da entidade. Por exemplo,, muito parecido com ou , representa U + 2014 : o caractere travessão "-" mesmo se a codificação de caractere usada não contiver esse caractere. &;&mdash;&#8212;&#x2014;

Para obter a lista completa, consulte: Lista de referências de entidades de caracteres XML e HTML .

Determinação de codificação de caracteres

Para processar HTML corretamente, um navegador da web deve verificar quais caracteres Unicode são representados pela forma codificada de um documento HTML. Para fazer isso, o navegador da web deve saber qual codificação foi usada.

Informação de codificação

Quando um documento é transmitido por meio de uma mensagem MIME ou de um transporte que usa tipos de conteúdo MIME, como uma resposta HTTP , a mensagem pode sinalizar a codificação por meio de um cabeçalho Content-Type, como Content-Type: text/html; charset=UTF-8 . Outros meios externos de declaração de codificação são permitidos, mas raramente usados. Se o documento usar uma codificação Unicode , as informações de codificação também podem estar presentes na forma de uma marca de ordem de bytes . Finalmente, a codificação pode ser declarada por meio da sintaxe HTML. Para a text/html serialização, então, contanto que a página seja codificada em uma extensão de ASCII (como UTF-8 e, portanto, não se a página estiver usando UTF-16 ), um meta elemento, como <meta http-equiv="content-type" content="text/html; charset=UTF-8"> ou (começando com HTML5 ) <meta charset="UTF-8"> pode ser usava. Para páginas HTML serializadas como XML, as opções de declaração devem contar com o padrão de codificação (que para documentos XML é UTF-8) ou usar uma declaração de codificação XML. O metaatributo não desempenha nenhuma função em HTML servido como XML.

Padrões de codificação

Um padrão de codificação se aplica quando não há declaração de codificação externa ou interna e também nenhuma marca de ordem de Byte. Embora o padrão de codificação para páginas HTML servidas como XML deva ser UTF-8, o padrão de codificação para uma página da Web regular (ou seja: para páginas HTML serializadas como text/html ) varia dependendo da localização do navegador. Para um sistema configurado principalmente para idiomas da Europa Ocidental, geralmente será o Windows-1252 . Para localidades do alfabeto cirílico, o padrão é geralmente Windows-1251 . Para um navegador de um local onde predominam as codificações de caracteres multibyte legados, é provável que alguma forma de detecção automática seja aplicada.

Tendências de codificação

Por causa do legado de representações de texto de 8 bits em linguagens de programação e sistemas operacionais e o desejo de evitar sobrecarregar os usuários com a necessidade de entender as nuances da codificação, muitos editores de texto usados ​​por autores de HTML são incapazes ou não querem oferecer uma escolha de codificações ao salvar arquivos no disco e muitas vezes nem mesmo permitem a entrada de caracteres além de um intervalo muito limitado. Consequentemente, muitos autores de HTML não estão cientes dos problemas de codificação e podem não ter nenhuma ideia de qual codificação seus documentos realmente usam. Mal-entendidos, como a crença de que a declaração de codificação afeta uma mudança na codificação real (enquanto na verdade é apenas um rótulo que pode ser impreciso), também é um motivo para essa atitude do editor. Outro fator que contribui na mesma direção, é a chegada do UTF-8 - que diminui muito a necessidade de outras codificações, e assim os editores modernos tendem a padronizar, conforme recomendado pela especificação do HTML5, o UTF-8.

Marca de ordem de bytes / detecção de Unicode

Para ambas as serializações de HTML (content-type "text / html" e content / type "application / xhtml + xml"), a marca de ordem de bytes (BOM) é uma maneira eficaz de transmitir informações de codificação em um documento HTML. Para UTF-8, o BOM é opcional, embora seja obrigatório para as codificações UTF-16 e UTF-32. (Nota: UTF-16 e UTF-32 sem o BOM são formalmente conhecidos por nomes diferentes, são codificações diferentes e, portanto, precisam de alguma forma de declaração de codificação - consulte UTF-16BE , UTF-16LE , UTF-32LE e UTF-32BE .) O uso do caractere BOM (U + FEFF) significa que a codificação se declara automaticamente para qualquer aplicativo de processamento. Os aplicativos de processamento precisam apenas procurar um 0x0000FEFF, 0xFEFF ou 0xEFBBBF inicial no fluxo de bytes para identificar o documento como UTF-32, UTF-16 ou UTF-8 codificado respectivamente. Nenhum mecanismo de metadados adicional é necessário para essas codificações, uma vez que a marca de ordem de byte inclui todas as informações necessárias para o processamento de aplicativos. Na maioria das circunstâncias, o caractere de marca de ordem de byte é manipulado pela edição de aplicativos separadamente dos outros caracteres, então há pouco risco de um autor remover ou alterar a marca de ordem de byte para indicar a codificação errada (como pode acontecer quando a codificação é declarada em Script inglês / latino). Se o documento não tiver uma marca de ordem de bytes, o fato de que o primeiro caractere imprimível não em branco em um documento HTML deve ser "<" (U + 003C) pode ser usado para determinar um UTF-8 / UTF-16 / Codificação UTF-32.

Substituição de codificação

Muitos documentos HTML são fornecidos com informações de codificação imprecisas ou sem nenhuma informação de codificação. Para determinar a codificação em tais casos, muitos navegadores permitem que o usuário selecione manualmente um nome de codificação em uma lista. Eles também podem utilizar um algoritmo de detecção automática de codificação que trabalha em conjunto com ou - no caso do BOM e em caso de HTML serviu como XML - contra o accionamento manual.

Para documentos HTML que são text/html serializados, a substituição manual pode se aplicar a todos os documentos ou apenas àqueles para os quais a codificação não pode ser verificada olhando para declarações e / ou padrões de bytes. O fato de a substituição manual estar presente e amplamente usada impede a adoção de declarações de codificação precisas na Web; portanto, é provável que o problema persista. Mas observe que o Internet Explorer, Chrome e Safari - para XML e text/html serializações - não permitem que a codificação seja substituída sempre que a página incluir o BOM.

Para documentos HTML serializados com o rótulo XML preferido - application/xhtml+xml , a substituição manual da codificação não é permitida. Substituir a codificação de tal documento XML significaria que o documento deixou de ser XML, pois é um erro fatal para documentos XML ter uma declaração de codificação com erros detectáveis. Atualmente, os navegadores Gecko, como o Firefox, obedecem a esta regra, enquanto a maioria dos outros navegadores comuns que oferecem suporte a HTML como XML, como os navegadores Webkit (Chrome / Safari), permitem que a codificação de documentos XHTML seja substituída manualmente.

Suporte para navegador da web

Muitos navegadores são capazes de exibir apenas um pequeno subconjunto do repertório Unicode completo. Veja como seu navegador exibe vários pontos de código Unicode:

Exemplo de suporte de navegador da web para caracteres Unicode
Personagem HTML char ref Nome Unicode O que seu navegador exibe
U + 0041 &#65; ou &#x41; Letra latina A maiúscula UMA
U + 00DF &#223; ou &#xDF; Letra latina minúscula Sharp S WL
U + 00FE &#254; ou &#xFE; Thorn em latim minúsculo º
U + 0394 &#916; ou &#x394; Delta maiúscula grega Δ
U + 017D &#381; ou &#x17D; Letra latina Z maiúscula com háček Ž
U + 0419 &#1049; ou &#x419; Letras maiúsculas em cirílico Short I Й
U + 05E7 &#1511; ou &#x5E7; Letra hebraica Qof ק
U + 0645 &#1605; ou &#x645; Letra árabe meem م
U + 0E57 &#3671; ou &#xE57; Dígito tailandês 7
U + 1250 &#4688; ou &#x1250; Ge'ez sílaba Qha
U + 3042 &#12354; ou &#x3042; Hiragana letra A (japonês)
U + 53F6 &#21494; ou &#x53F6; CJK Unified Ideograph -53F6 ( chinês simplificado "Folha")
U + 8449 &#33865; ou &#x8449; CJK Unified Ideograph -8449 ( "Folha" do chinês tradicional )
U + B5AB &#46507; ou &#xB5AB; Sílaba hangul Tteolp (coreano "Ssangtikeut Eo Rieulbieup")
U + 16A0 &#5792; ou &#x16A0; Runic carta Fehu
U + 0D37 &#3383; ou &#x0D37; Letra malaiala ഷ (ṣha)
U + 1F602 &#128514; ou &#x1F602; Emoji de rosto com lágrimas de alegria 😂
Para exibir todos os caracteres acima, pode ser necessário instalar uma ou mais fontes multilíngues grandes, como Code2000 .

Alguns navegadores da web, como Mozilla Firefox , Opera , Safari e Internet Explorer (a partir da versão 7), são capazes de exibir páginas da web multilíngues escolhendo de forma inteligente uma fonte para exibir cada caractere individual na página. Eles exibirão corretamente qualquer combinação de blocos Unicode , desde que as fontes apropriadas estejam presentes no sistema operacional .

Navegadores mais antigos, como o Netscape Navigator 4.77 e o Internet Explorer 6 , só podem exibir texto compatível com a fonte atual associada à codificação de caracteres da página e podem interpretar erroneamente as referências de caracteres numéricos como sendo referências a valores de código dentro da codificação de caracteres atual. do que referências a pontos de código Unicode. Quando você usa esse tipo de navegador, é improvável que seu computador tenha todas essas fontes ou que o navegador possa usar todas as fontes disponíveis na mesma página. Como resultado, o navegador não exibirá o texto nos exemplos acima corretamente, embora possa exibir um subconjunto deles. Por serem codificados de acordo com o padrão, porém, eles serão exibidos corretamente em qualquer sistema que seja compatível e tenha os caracteres disponíveis. Além disso, esses caracteres com nomes para uso em referências de entidades nomeadas provavelmente estão mais comumente disponíveis do que outros.

Para exibir caracteres fora do Plano Multilíngue Básico , como a letra gótica faihu, que é uma variante da letra rúnica fehu na tabela acima, alguns sistemas (como o Windows 2000) precisam de ajustes manuais em suas configurações.

Frequência de uso

De acordo com dados internos do índice da web do Google , em dezembro de 2007 a codificação UTF-8 Unicode se tornou a codificação mais usada em páginas da web, ultrapassando tanto ASCII (EUA) quanto 8859-1 / 1252 (Europa Ocidental).

Veja também

Referências

links externos