Unicode

Unicode é algo que me deixa confuso.

Afinal sobre quais circunstâncias UTF-8 não suporta acentos? Isso não é claro para mim.

Por exemplo, em meu Ubuntu ao utilizar o gnome-terminal com UTF-8 não é raro eu me deparar com algum caractere “bugado”, ao utilizar o editar de texto Vim no próprio terminal não posso digitar um caractere com acento que ele aparece seguido de um espaço (Pelo menos aparece, mas o comportamento estranho é por de mais incomodo).

Enquanto posto, fiz um teste, escrevendo uma linha de programa Ruby no vim, escrevi:

print "Teste: á ã â"

Após uma longa batalha com o Vim que não conseguia se comportar bem na presença de acentos, consegui salvar o arquivo como teste.rb e rodar no terminal, que logo me retornou:

teste.rb:2: invalid multibyte char (UTF-8) teste.rb:2: invalid multibyte char (UTF-8)

Porque? O que está errado nessa aventura?

Se eu mudo o encoding do terminal para ISO-8859-1, o Vim se comporta direitinho, se eu mudo o encoding do arquivo ruby para ISO-8859-1 o terminal retorna:

Note que aqui meu terminal está em UTF-8, como antes quando dava o erro, seu eu mudar o terminal também para ISO-8859-1, temos:

Essa me supreendeu, esperava uma resposta bem comportada dessa vez, porque os “as” minusculos com acentos variáveis se tornaram Ãs? Testei e percebi que o proprio arquivo teste.rb tinha sido modificado de alguma forma, modifiquei para a velha string “á ã â” e dessa vez deu certo:

Com tantos problema eu devo ainda insistir em UTF-8? Não podemos culpa minha gana de mudar tudo o possível para ISO-8859-1, porém eu ando lendo e todo mundo me recomenda a usar UTF-8, queria então entender os problemas desse encoding e como lidar com eles, alguém pode me ajudar?

Antes na verdade você precisa entender bem o que é ‘encoding’ e pq ISO-8859-1 ou UTF-8.

Esse texto me mostrou muita coisa sobre isso:

Bom primeiro obrigado, estava mesmo procurando informações sobre Unicode.

Tem algumas duvidas quanto ao artigo, e talvez você possa me responder:

Unicode é um “tabelão” de 16 bits? Assim casa caractere corresponde a um numero na tabela? Se é assim porque ele diz que:

“There is no real limit on the number of letters that Unicode can define and in fact they have gone beyond 65,536 so not every unicode letter can really be squeezed into two bytes, but that was a myth anyway.”

Não tem limites? Como ele vai ter mais que 65536? Como assim uma letra pode ser espremida em 2 bytes?

E a outra duvida é a respeito do encoding, a diferença entre o UTF-8 e o Unicode puro, é que o UTF-8 gasta menos memoria?

resposta rápida, tu só tem que fazer o Ruby saber qual o encoding do arquivo, pelas mensagens imagino que tu esteja utilizando Ruby 1.9
Coloca no inicio do arquivo

encoding: UTF-8

E salva o arquivo em UTF-8