Charsets e encodings

Introdução

Dividi o assunto de charsets e encodings em uma série de artigos que poderão ser acessados (a medida que forem publicados) apenas clicando na tag charset-e-encoding. A lista dos textos em ordem é a seguinte:

  1. Charsets e encodings (este aqui)
  2. Declarando encodings em XHTML
  3. Usando entities e referências numéricas de caracteres – NCR
  4. Configurando encodings em ferramentas de desenvolvimento
  5. Declaração de codificação de caracteres por CSS

Enquanto escrevia este texto, aos poucos ele foi tomando dimensões maiores do que eu esperava. Um hyperlink me levou a um documento, um documento me levava a outro, cada vez mais longe e assim por diante. Vários trechos são traduções pessoais dos documentos originais mesclados com partes de minha própria autoria. Todas as referências foram citadas em seus devidos trechos e a maioria foi comentada no tópico referências, no final de cada artigo.

Espero que nestes artigos você encontre tudo o que precisa saber sobre charsets e encodings em um verdadeiro dossiê sobre o assunto. Sua opinião e seus comentários continuam sendo muito valiosos. Aguardo seu feedback.

Conceitos

Para saber utilizar charsets e encodings de forma mais madura e menos arriscada, é necessário compreender alguns conceitos e definições para poder entender tudo o que precisa sobre codificação de caracteres em linguagens de marcação como o XML e HTML. Então vamos aos conceitos.

Charset

Charset significa “conjunto de caracteres” (character set), e é comumente referênciado apenas como “charset”. Os charsets foram feitos como uma biblioteca de caratecteres que podemos utilizar, para serem utilizados com propósitos gerais em computadores, softwares, browsers etc.

Os charsets mais conhecidos são os da série ISO-8859 (ISO-8859-1, ISO-8859-2, ISO-8859-3, …, ISO-8859-10) e os da família Unicode (UTF-8, UTF-16, UTF-32).

Code Caracter Set (code points)

Em cada conjunto de caracteres (charsets), para cada caractere existe um número único designado para identificação. Essas unidades númericas são chamadas de “code points“. Por exemplo a letra “a” no encoding ISO 8859-1 está na posição de número 65, e assim por diante com cada caractere do conjunto.

Encoding

O “character encoding”, ou apenas “encoding” é a maneira com que os conjuntos de caracteres são mapeados e manipulados pelas máquinas, seja um software, seja um browser etc. Vamos entender como isto funciona.

No encoding ISO 8859-1 a letra “A” está na posição 65º (começando do zero) e pode ser representado no computador usando um único byte com valor de 65. Para o ISO 8859-1 isso nunca muda. Para os encodings da série unicode, as coisas não são tão diretas assim. Embora o code point para a letra “à” no charset unicode seja sempre 255 (em decimal), ele pode ser representado em um computador por 1, 2 ou até 4 bytes, dependendo do encoding utilizado (UTF-8, UTF-16 ou UTF-32). Ou seja, usando o charset unicode, é possível que um caractere seja codificado de formas diferentes dependendo do encoding escolhido.

O XML e o HTML (da versão 4 em diante), foram criados com um modelo lógico na forma como são processados, baseados no Unicode. Isso não significa que todo HTML e todo XML deve ser codificado com algum encoding da série Unicode. Significa entretando que os documentos podem conter somente caracteres definidos pelo unicode. Qualquer caractere pode ser codificado em um documento contanto que ele seja um subconjunto do repertório do unicode. No nosso caso que utilizamos caracteres latinos, uma outra soluções aceitável para ser utilizada no lugar de algum encoding da série unicode seria o ISO-8859-1, onde todos seus caracteres, também fazem parte da série unicode.

Unicode

Unicode é um conjunto de caracteres (“character set” ou apenas “charset”), ou seja um padrão que define em um único conjunto, todos os caracteres necessários para escrever a maioria das línguas atuais em uso em computadores hoje. O unicode tem o objetivo de ser um super conjunto de todos os caracteres já codificados em outros conjuntos.

Existe um consórcio internacional sem fins lucrativos, fundado só para ampliar e promover o uso do unicode no mundo. Leia sobre o consórcio em português para mais informações.

É importante distinguir a diferença entre conjunto de caracteres (“character set” ou apenas “charset”) e codificação de caracteres (“character encoding” ou apenas “encodings”), que justifica o título deste artigo. O unicode é um tipo de charset, ou seja, um tipo de conjunto de caracteres dentre outros, como os da série ISO-8859. E dentro do charset unicode, existem 3 encodings conhecidos como UTF-8, UTF-16, UTF-32 que podem ser utilizados. O encoding UTF-8 da série unicode é a recomendação mais amplamente utilizada.

Todo o jargão necessário para entender charsets e encodings foi definido aqui. Nos próximos textos vamos ver uma aplicação mais prática sobre este assunto e a melhor forma de configurar encodings nos seus projetos.

Referências:

Se você está acostumado a desenvolver user agentes (apenas por diversão) e realmente precisa se aprofundar sobre este assunto o texto UTF-8, a transformation format of ISO 10646 de Yergeau e Character Set considered harmful de Dan Connolly do MIT são dois textos obrigatórios que pode tirar suas noite de sono.

  • Felipe Ranieri

    Olá Henrique, bastante interessante o artigo, com certeza uma ótima base para quem está iniciando a carreira, assim como eu.

    Abraços!

  • http://cirofeitosa.com.br/ Ciro Feitosa

    Muito bom seu artigo. Boa base sobre o assunto. Parabéns. Abraço!

  • Pingback: Usando entities e referências numéricas de caracteres - NCR » Revolução Etc()

  • tarcísio lima

    prezado sr. henrique,

    sou totalmente leigo em informática, seus sistemas, suas codificações, etc… mas, mesmo como leigo, quanto aos assuntos específicos dessa área, sou um usuário do dia-a-dia, por, no mínimo, 8 ou mais horas! sou músico. e esperantista. como esperantista, uso com freqüência caracteres especiais que obtenho lançando mão de recursos do “word” ou através do uso da tecla "alt", em associação com um certo número. p-ex.: as reticências que usei há pouco resultam de , nas fontes comuns.

    minha pergunta é: como faço para usar os caracteres em unicode? p-ex.: conforme o mapa de caracteres, na fonte "times new roman" a letra G (g maiúsculo) com circunflexo tem o código . o que vem a ser esse "U+"? como eu poderia usar essa letra em qualquer programa de texto?

    de antemão, obrigado.

    tarcísio lima

  • Pingback: Links comentados via del.icio.us - 5 » Japs()

  • Pingback: Wagner Elias - Think Security First » Blog Archive » XML Firewall()

  • Pingback: Language Tags » Revolução Etc()

  • Luciano Fernandes

    O que se faz quando qualquer encoding dá pau no internet explorer? Isto é, montei um site, coloquei o charset pra ISO-8859-1 tanto no html, no inicio do arquivo de css, no head em classes php, e na configuração do banco de dados. Tá aparecendo legal no firefox, mas no IE tá aparecendo caracteres estranhos. eu fiz a mesma coisa para UTF-8 e piorou, pois o firefox passou a dar problema também.

    Isso tem solução ou devo sentar e chorar?

    OBS: Muitas páginas de portais como o Terra tem esse mesmo problema.

  • Pingback: Começando um blog no WordPress - parte 1 : Jean Carlo()

  • Pingback: Tutorial Iniciante de HTML: Tags, Atributos e Elementos « Codando()

  • Pingback: UTF-8 é o encoding mais utilizado no mundo na web, segundo o Google » Revolução Etc()

  • Pingback: asennadas » UTF-8 domina a web()

  • Pingback: Tutorial Avançado de HTML: Declarações « Codando()

  • Leon Santiago

    Olá, Henrique.

    Ótimo artigo.

    Uma dúvida. Não existe contra-indicação nenhuma em se utilizar UTF-8, então? Porque fiquei com a impressão que simplemente devemos abandonar os outros charsets. Ao mesmo tempo, senti falta de uma indicação mais enfática no texto, nesse sentido, então fiquei em dúvida.

  • http://www.flashmedia.com.br bruno rios

    Uma dúvida… Para usar ISO-8859-1, devo converter todos os caracteres do meu código fonte para as entities correspondentes?

    Pois eu faço meus sites "na mao" e sempre digito todos os caracteres normalmente, acentos, cedilhas, aspas… e tudo parece perfeito aqui…

  • Pingback: Charsets e encodings » Revolução Etc()

  • Pingback: Validação de campos de texto com caracteres acentuados | KISS()

  • Pingback: .NET – Problema na Codificação no envio de Emails | Tomás Vásquez - Blog()