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.