[Cascavel-pm] [off] Problemas com charset. Dicas para solução?

Eden Cardim edencardim em gmail.com
Sexta Junho 18 17:51:06 PDT 2010


>>>>> "João" == João Gabriel Casteluber Laass <gabriel em joaogabriel.org> writes:

    João> O problema é que todas as palavras acentuadas agora aparecem
    João> com um "?" em navegadores web.

Tem certeza que são só as acentuadas?

    João> Não é o charset da aplicação que solicita dados no banco de
    João> dados porque é a mesma aplicação (inclusive a versão da
    João> aplicação é a mesma)

Explica de novo, isso que você falou não fez sentido.

    João> [A aplicação em questão é o DotProject versão 2.1 e os campos
    João> com texto estão com COLLATE utf8_unicode_ci].

COLLATE não tem nada a ver com a exibição dos caracteres.

    João> Outro fato é que os novos registros no banco de dados estão
    João> corretos.Já tentei de várias formas (usando Perl, Java,
    João> funções do PHP, outros softwares) descobrir em que charset
    João> estão as palavras acentuadas com erro. Não consegui
    João> nada. Absolutamente nada.

Sinto lhe informar, mas codificação de caracteres não é algo dedutível,
você precisa saber a codificação usada na hora em que os caracteres
foram armazenados, não tem como "adivinhar". O máximo que você pode
fazer é ir tentando todas as codificações que você acha que foram usadas
e verificar visualmente se o caracter que aparece faz sentido.

    João> Segue um exemplo de pequenas frases com problemas:CAF� DA
    João> TARDE --> deveria ser "CAFÉ DA TARDE"Caf é --> deveria ser
    João> "Café"REUNI�ES INTERNAS --> deveria ser "REUNIÕES INTERNAS"

Isso está com cara de UTF8 interpretado como Latin-1 ou algum outro tipo
de codificação de largura não-variável. Tanto UTF8 e Latin-1 são
projetadas para que os primeiros 128 caracteres coincidam com ASCII, por
motivo de retrocompatibilidade, por isso o problema só se manifesta nos
caracteres non-ASCII (dentre eles, as letras acentuadas). Observa como o
"é" se transformou em "é" (dois caracteres) e "Õ" se transformou em
"�" (3 caracteres) por conta do fato de "é" em UTF8 ser representado
por 2 bytes e "Õ" ser representado por 3 bytes. Ou seja, os caracteres
estão armazenados em UTF8 mas o software que exibe os caracteres está
decodificando em alguma codificação de tamanho fixo (como Latin-1). Se
for isso é bem simples, é só mudar a codificação do browser para UTF-8
(no firefox fica em View > Character Encoding > Unicode (UTF8)). Mas,
pode ser que algum software recodificou os caracteres com essa
interpretação errada e aí você nunca vai saber qual era a codificação do
caracter original, porque nesse caso o banco de dados realmente está
armazenando caracteres codificados, em UTF8, que foram re-convertidos de
uma decodificação errônea para Latin-1. (ufa, deu pra entender?)

Seguem alguns artigos que deve esclarecer melhor o que está acontecendo:
http://www.joelonsoftware.com/articles/Unicode.html
http://www.faqs.org/rfcs/rfc2044.html


Mais detalhes sobre a lista de discussão Cascavel-pm