A solução que apresento tem como pressuposto uma página ou um site em que o charset é o ISO-8859-1, a linguagem de programação o PHP e o banco de dados o MySQL. Penso, que essa solução, pode facilmente ser adaptada para outras situações.
O assunto já foi objeto de posts no El Micox, no JulioGreef Blog e no fóruns iMaster, pelo menos.
O experimento é apresentado tomando-se como base um exemplo em que considera os métodos GET e POST do objeto XMLHttpRequest e os charset’s UTF-8 e ISO-8859-1 como formatos de gravação no banco de dados. E, claro, de acordo com a combinação entre método e charset é realizada a exibição correta dos caracteres acentuados no padrão da página ou site, no caso o ISO-8859-1.
A primeira medida é colocar no início das rotinas PHP o código a seguir para informar ao AJAX que os textos – label’s dos formulários, mensagens de erro e dados -, estão no formato ISO-8859-1.
<?php header("Content-Type: text/html; charset=ISO-8859-1",true) ?>
Mesmo com esse código, é interessante observar o comportamento dos browsers frente aos métodos GET e POST do objeto XMLHttpRequest:
- No IE6, IE7, Netscape 8.0 e Firefox 2.0.0.7 os dados chegam nas rotinas chamadas, quando se usa o método GET, no formato ISO-8859-1 e no formato UTF-8 quando é utilizado o método POST;
- Já no Opera 9.0 em ambos os casos os dados chegam no formato UTF-8.
O comportamento em outros browsers, como por exemplo, o Safari, não tenho como estabelecer nessa situação. Quem sabe alguém aí pode ajudar.
Isso posto, o próximo passo é tratar os campos com informações textuais para gravá-los no banco de dados no formato desejado.
O papel é cumprido pelas instruções a seguir, de fácil interpretação, espero, e que leva em consideração as observações acima colocadas:
if ($charset == "ISO-8859-1" && $metodo == "POST") {
$titulo = utf8_decode($titulo); // Converte os dados para ISO-8859-1
$noticia = utf8_decode($noticia);
}
if ($charset == "UTF-8" && $metodo == "GET") {
if ($browser != "Opera") {
$titulo = utf8_encode($titulo); // Converte para UTF-8
$noticia = utf8_encode($noticia);
}
}
if ($browser == "Opera" && $charset == "ISO-8859-1" && $metodo == "GET") {
$titulo = utf8_decode($titulo);
$noticia = utf8_decode($noticia);
}
Gravação efetuada, resta agora tratar os dados para que sejam exibidos no padrão ISO-8859-1:
if ($rsnoticia->charset == "ISO-8859-1") {
$ch_titulo = $rsnoticia->titulo;
$ch_noticia = $rsnoticia->noticia;
} else {
$ch_noticia = utf8_decode($rsnoticia->noticia);
$ch_titulo = utf8_decode($rsnoticia->titulo);
}
Faça o download do experimento para analisar e testar e qualquer dúvida ou problema entre em contato.
Alexandre
fev 16, 2009 @ 11:43:53
D+!!! Quebrei a cabeça por 2 dias direto tentando resolver isso e nada de descobrir!!! Vlw msm muito bom!!!
Micox
out 01, 2007 @ 09:25:53
Finalmente uma analise completa e perfeita.
Linkando…