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

Blabos de Blebe blabos em gmail.com
Sábado Junho 19 09:56:47 PDT 2010


Almost very easy...

Primeiramente arrependa-se verdadeiramente dos seus pecados (e dos
pecados de quem não fez tudo em UTF-8 desde o começo).

Faz um dump do banco atual para arquivo, de forma análoga ao modo que
foi feito com o antigo. Espera-se que os dados antigos fiquem
idênticos ao dump anterior. Se não ficar, converta adequadamente para
que fiquem.

É possível que caracteres estranhos importados sejam recodificados
denovo no dump, então pode ser necessário mais de um passo de
decodificação. Provavelmente 2 passos bastam se necessário.

Deixe os dois arquivos de dump como mesmo encoding dos registros
antigos. Mesmo que os dados novos fiquem quebrados.

Se você tem sorte, use os campos de datas para separar os registro novos.

Se você tem quase nada de sorte, use diff para separar os registros novos.

Se você não tem sorte alguma e não conseguiu obter os encodings
corretos, use Perl para separar os registros (Quem precisa de sorte
quando se tem Perl?). String::Trigram é uma boa pedida.

Converta os registros novos para o mesmo encoding usado no dump antigo.

Use patch (ou meld) para adicionar ao dump antigo os registros novos
convertidos para o mesmo encoding no passo anterior.

Um de Dois:

1) Converta tudo para UTF-8 (inclusive a aplicação), recrie o banco em
UTF-8 e viva feliz.

2) Recrie o banco com o mesmo encoding do dump e torça para ninguém
nunca mais repetir essa cagada.

Peça uma promoção e me mande 10% :)

Provavelmente deve ser simples descobrir os encodings, que geralmente
são ISO-8859-1, ISO-8859-15, UTF-8 ou WINDOWS-1252, por tentativas.

Bom, se a sua aplicação for em alguma língua estranha, vai ficar um
pouco mais difícil...

Abraços

2010/6/19 João Gabriel Casteluber Laass <gabriel em joaogabriel.org>:
> Uhh! Vamos com calma, vou tentar responder algumas questões.
>
> 1. Se eu "voltar no tempo" e exportar o banco de dados antes da formatação,
> eu irei perder os novos registros. Acreditem, depois da formatação muitos
> registros foram feitos.
>
> 2. A codificação do banco e a codificação da página web (aplicação) estão em
> UTF-8.
>
> 3. Se eu der um dump hoje, via DOS, os novos registros saem corretamente
> acentuaçãos. Os antigos permanecem incorretos. (a saida do dump vai para um
> arquivo SQL)
>
>
>> 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?)
>
> Sim, entendi. (não queria entender, mas entendi).
>
>
> Vou fazer mais alguns testes (em ambiente de testes é claro) e posto minha
> conclusões assim que possível.
>
>
> Um abraço,
> João Gabriel Casteluber Laass
>
>
>
>
>
>
>
>
>
> Em 18 de junho de 2010 21:51, Eden Cardim <edencardim em gmail.com> escreveu:
>>
>> >>>>> "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
>> _______________________________________________
>> Cascavel-pm mailing list
>> Cascavel-pm em pm.org
>> http://mail.pm.org/mailman/listinfo/cascavel-pm
>
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>


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