[Cascavel-pm] Problemas com acentuação

Gilmar Júnior gilmarjr em im.ufba.br
Sexta Outubro 21 13:40:24 PDT 2005


Olá, Monges!

Resolvi o problema hoje. Assim que os dados são recebidos (em UTF-8. não
achei na w3c alguma menção ao charset utilizado pra enviar formulários,
mas parece que o navegador devolve no mesmo charset que recebeu. Como a
página que exibe o formulário é em utf-8 então os dados recebidos tb
são) há uma conversão para de utf8 pra a representação interna do perl
[Encode::decode('utf8', $dado)], sengundo a documentação do módulo
Encode quando isso acontece (converter uma string do charset utf8 [ou de
qualquer outro exceto ascii ou outro que não lembro] pra a representação
interna) um flag UTF-8 é ligado na string, que agora está representada
pelo formato interno. Ainda no módulo Encode há uma função interna pra
testar se esse flag está ligado [Encode::is_utf8($str)]. O mesmo
resultado, em teoria, é obtido com utf8::is_utf8($str). Pois bem, no
módulo DBIx::SearchBuilder::Record [responsável por gravar e ler os
dados do banco] há uma função que concatena a string para caber no
banco, caso seja maior que o tamanho permitido. Essa função testa se a
string é utf8 com Encode::is_utf8. Finalmente chegamos ao problema.

Encode::is_utf8($str) estava retornando falso, enquanto
utf8::is_utf8($str) verdadeiro. Fiz vários testes e notei que
utf8::is_utf8 acertou todos, enquanto Encode::is_utf8 não. Encode é um
módulo de interface do perl (eu acho) e utf8 parece ser interno, como o
strict. A versão do perl que estou usando é a 5.8.4 (debian sarge). Na
etch (debian testing) está a versão 5.8.7, que não apresenta o problema.

Resolvi a situação alterando o módulo DBIx::SearchBuilder::Record, pra
passar a fazer testes com utf8::is_utf8, ao invés do Encode...

Enfim, só pra registrar e ajudar alguém que passe por problema parecido
futuramente.

Agradeço as dicas!

Gilmar.

Luis Campos de Carvalho escreveu:

>--- Gilmar Júnior <gilmarjr em im.ufba.br> escreveu:
>  
>
>>Mas e como ficam dados fornecidos pelos usuários? pelo que pude
>>interpretar da solução da última vez que tiver problema com isso, o
>>navegador do usuário estava mandando caracteres acentuados (e não
>>codificados como no html) em iso-8859-1 e como a saída (para o banco)
>>deveria ser em utf-8 havia o problema. Tem como eu "obrigar" que o
>>usuário mande dados em uma certa codificação? Tem como "detectar" a
>>codificação de uma string? (ja vi no perlunicode e no encoding que posso
>>converter de uma codificação pra outra, mas não vi como detectar...)
>>    
>>
>
>  Hum. Bom, prá mim, dados de usuário são ainda um problema em aberto: eu normalmente costumo
>apenas me certificar de que posso oferecer de volta as informações na mesma codificação que me foi
>enviada, garantindo que o banco de dados e o aplicativo web não melem a codificação. Na prática, é
>como tratar tudo como se fosse binário.
>
>  Eu gostaria de saber de outros jeitos, independentes de /character set/, para resolver este
>problema... sugestões, patches e xingamentos são bem-vindos! ;-)
>
>  Putamplexos!
>
>--
>Luis Campos de Carvalho
>Member of "São Paulo Perl Mongers",
>Unix SysAdmin & OCP/DBA Oracle
>http://br.geocities.com/monsieur_champs/
>
>
>	
>
>
>
>	
>		
>_______________________________________________________ 
>Promoção Yahoo! Acesso Grátis: a cada hora navegada você acumula cupons e concorre a mais de 500 prêmios! Participe! http://yahoo.fbiz.com.br/
>_______________________________________________
>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