Acentuação em formulário Flash com PHP

Autor: Michel Scoz

Se você acompanha alguns fóruns na internet, revistas ou páginas relacionadas a Flash ou a linguagem Action Script em geral, você provavelmente deve ter observado que há muitas pessoas com dúvidas relacionadas a como resolver problemas de acentuação no Flash, seja ao abrir algum arquivo TXT, XML ou até mesmo quando você faz um formulário de contato para enviar os dados preenchidos por email e a pessoa recebe o email com caractéres estranhos, sem sentido ou legibilidade alguma. Quem nunca se deparou com um problema destes ao fazer um site em Flash? Aposto que quase todos que começam a desenvolver no Flash acabam passando por este tipo de problema, cedo ou tarde!

Para resolver este problema de acentuação, muitas pessoas utilizam, e indicam, o comando “System.useCodePage = true;”. O que poucos sabem é que para este problema NÃO é solucionado desta forma no Flash! Você já deve ter ouvido aquela velha frase: “Não adianta tampar o sol com a peneira!”, não deve? Esta frase se encaixa perfeitamente no nosso contexto.

Este artigo tem o propósito de trazer informações suficientes para que todos entendam de forma clara e simples, quando usar e quando não usar este comando para solucionar problemas de acentuação ou com idiomas estrangeiros.



O que causa os erros de acentuação no Flash?

A partir da versão 6.0, o Adobe Flash trouxe e tomou como padrão a codificação Unicode (UTF-8) para textos/dados. Qualquer usuário com a versão 6.0, ou superior, tem a possibilidade de visualizar textos em outras línguas, independente do sistema operacional (SO) rodando na máquina.

Esta codificação Unicode tem o propósito de fornecer um número para cada caractere existente, independente da plataforma, programa ou língua nativa do sistema em questão. Desta forma, evitasse os problemas com codificações diferentes que acontecem em função de cada língua possuir os seus próprios caracteres especiais, como o caso do da língua portuguesa por exemplo, que possuímos o acento agudo, acento grave, acento circunflexo, trema, etc.

QUOTE

Dica:
O padrão que o Flash utiliza é UTF-8, é um dos tipos de codificação Unicode. Você pode ler sobre o assunto em www.unicode.org.

Sendo assim, depois da adoção do Unicode como codificação padrão, a partir do momento que você faz o Flash ler um arquivo texto ou um XML, estes dados são lidos com a codificação UTF-8. O que acontece é que mandamos os dados codificados no formato nativo da nossa língua, que no caso da língua portuguesa é o padrão ISO-8859-1, e o Flash espera receber estes dados em outra codificação, causando assim uma incompatibilidade na leitura destas informações. Este é o motivo dos problemas da falta de acentuação e aparição de caracteres ilegíveis.

O mesmo problema ocorre quando você envia alguns dados do Flash, visto que o padrão dele serve tanto para o envio como para a leitura de dados. Isto faz com que formulários de contatos, por exemplo, também apareçam com caracteres estranhos nos e-mails na hora da leitura!



Onde entra o “System.useCodePage” nessa história? Por que foi ele criado? Como funciona?

O que a Macromedia (hoje Adobe) trouxe para o Flash, já visando este tipo de problema, foi o System.useCodePage. Na própria documentação do Flash, se você procurar no menu de Ajuda ou no liveDocs da Adobe, você vai ver que eles recomendam que se utilize o comando abaixo para resolver estes problemas de acentuação:
System.useCodePage = true;

O motivo para “ativar” esta “opção”, digamos assim, se restringe a resolver estes problemas de acentuação no envio dos dados de formulários para outra fonte, seja um PHP, ASP, CF ou outra linguagem, e realmente “resolve” nosso problema. Quando você utiliza este comando como indicado, o Flash utiliza a codificação padrão do sistema operacional do usuário que está acessando o site/swf. Assim sendo, se você mandou o Flash abrir um XML, ou carregar um texto que utiliza a codificação ISO-8859-1, o texto vai abrir corretamente para quem usa o Windows em português, por exemplo.



Por que NÃO usar System.useCodePage = true; então?!

O motivo para evitar-se o uso do System.useCodePage = true; é bem simples. O que acontece utilizando este comando, como citado anteriormente, é que ele faz com que o Flash utilize a codificação padrão do sistema operacional do usuário que está acessando o site/swf, mas isto nos traz um problema também. Se o usuário utilizasse o Windows em português, ou outro sistema operacional qualquer em outro idioma, de tal forma que este sistema operacional estivesse configurado com a codificação diferente do padrão aqui do Brasil, no caso, ISO-8859-1, já teríamos problemas!

Imagine a seguinte situação, você fez uma viajem para o Japão e necessita que um dos clientes que você está visitando preencha um formulário em seu site, ou aplicativo web para passar alguns dados de extrema importância para você. Seu site/aplicativo é feito em Flash e envia os dados para um PHP, que por sua vez irá enviar os dados para um determinado e-mail de sua empresa. Neste cenário, teremos o típico problema de se usar o comando em questão. Entenda o porquê…

No momento que esta pessoa está preenchendo o formulário, ela irá observar tudo como deveria, sem problema algum. Entretanto, no momento em que esta pessoa enviar os dados através do formulário do site, estes dados serão enviados utilizando o padrão configurado no sistema operacional deste usuário, visto que você “disse” para o Flash utilizar a codificação padrão do sistema do usuário através do System.useCodePage!

Quando você for receber e ler o e-mail na sua empresa, você notará que ele conterá vários caracteres diferentes e ilegíveis. Estes caracteres são caracteres que esta pessoa digitou e que fazem parte língua nativa dela, ou do sistema operacional caso a pessoa tenha configurado ou optado por usar outro padrão. É aqui que se caracteriza a incompatibilidade das codificações de textos/dados.

Em nossa situação imaginária, a pessoa que enviou os dados, enviou usando no padrão do sistema operacional, que no caso seria o “Shift-JIS”, pois o idioma nativo da pessoa era o Japonês. Na hora de enviar os dados, não fizemos tratamento algum dos caracteres especiais do idioma, logo os erros de caracteres aconteceram.

É claro que nossa situação pode ser um pouco fora da realidade, mas trazendo para um contexto do dia-a-dia de quem desenvolve sites em Flash, é bem comum as pessoas utilizarem notebooks importados com o Windows em Inglês, onde o padrão é o “CP1252″. Se um usuário enviou os dados no seu site usando o padrão do Brasil, e você tentar ler o e-mail no Windows em Inglês, você vai ter este problema de acentuação também. Entendeu porque o uso System.useCodePage não resolve 100% nosso problema?



Como resolver de uma vez por todas este problema então?!

Para resolver definitivamente o problema, se você ler atentamente o último parágrafo da documentação do Flash. Você vai saber o que fazer, mas caso não tenha lido, o parágrafo diz o seguinte:

“To ensure that users on all platforms can view external text files used in your SWF files, you should encode all external text files as Unicode and leave System.useCodepage set to false by default. This way, Flash Player 6 and later interprets the text as Unicode.”

Isto quer dizer que, para garantir que TODAS as plataformas apresentem os textos e XMLs corretamente, você deve garantir que estes dados sejam fornecidos na codificação padrão do Flash, no caso, Unicode (UTF-8).

Para fazer isto com PHP é extremamente simples… basta utilizar duas funções nativas, o utf8_decode() e utf8_encode().

Imagine que você esteja fazendo o PHP gerar um XML para o Flash ler. Então você deve usar o utf8_encode() para que os dados sejam codificados em UTF-8, como no exemplo abaixo:
print(’’ . utf8_encode($variavel_mensagem) . ‘’ );

Agora, se você precisa que o Flash envie os dados de um formulário para um e-mail ou para guardar em um banco de dados de tal forma que você tenha a possibilidade de ler e editar sem toda hora ter que codificar/decodificar, então você utilizaria o utf8_decode(), como o exemplo a seguir:
$mensagem = ‘Mensagem: ’ . utf8_decode($_POST[’mensagem’]) . “
”;

Pronto, problema resolvido, sem maiores dores de cabeça
Espero ter esclarecido este assunto, e que seja de grande utilidade para todos.

Até mais,

Michel Scoz
michelscoz [at] gmail [dot] com



-------------------------------------------------------------------------------------

Postagens Relacionadas
Anterior
« Anterior
Proxima
Proxima »