Resolvendo problemas de acentuação em Flash utilizando PHP


Resolvendo problemas de acentuação em Flash utilizando PHP
Por que não usar System.useCodePage?


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(‘<mensagem>’ . utf8_encode($variavel_mensagem) . ‘</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 = ‘<b>Mensagem: </b>’ . utf8_decode($_POST['mensagem']) . “<br>”;

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

Escrito por michelscoz on setembro 23, 2006. Arquivado em Flash. Você pode seguir as respostas a esse artigo pelo RSS 2.0. Você pode deixar respostas para esse artigo

13 respostas a Resolvendo problemas de acentuação em Flash utilizando PHP

  1. Valeu cara, a dica foi muito boa, e funciona mesmo!
    Um pouco mais trabalhoso tal vez, mais aí é a qualidade nos trabalhos que a gente perde muito tempo fazendo e o cliente não vê!! kkk!! Abraço, já implementei!.

    So uma consulta, eu uso uma função para chamar a um flash que é da seguinte forma:

    iFlash(“Nomedoflash.swf?nomeVariavel=Missão”, 999, 999, true);

    Com isso eu consigo passar corretamente o valor (Missão) para o flash, mais como eu poderia usar a função utf8_encode(´Missão’); para escrever a chamada no script iFlash, tem como?

  2. Tenho dois filmes em flash o primeiro carrega certinhos os acentos, quando chamo ele via loadmovienum, da erro na acentuação, o que pode ser isso ?

  3. Valeu mesmo!! Faz tempo q queria entender isso!! Funcionou beleza, vc eh O CARA!!!

  4. Queria saber como resolver o problema de acentuação no caso de o Flash carregar os textos diretamente de um arquivo .txt via loadMoviveNum sem intervenção do PHP.

  5. Tenho a mesma dúvida.
    “Queria saber como resolver o problema de acentuação no caso de o Flash carregar os textos diretamente de um arquivo .txt via loadMoviveNum sem intervenção do PHP.”

  6. nao funciona quando se usa a API do TWITTER…
    precisei gerar um XML de um determinado usuario do twitter, usei o utf8_decode nos campos para tratar os acentos, mas ele não funcionou, tive que criar uma função para isso.

  7. não funciona.

  8. Tipo, para que o flash leia corretamente os arquivos TXT. Ao invês de utilizar um programa primario como o notepad, utilizar um editor de texto mais robusto que permita salvar arquivos tb no formato unicode ou utf8. Isso é fundamental.. O notepad só salva no formato ANSI, que não é compativel com unicode e utf8.

    Um bom editor seria o EDITPLUS, salva não só nesses formatos, como tb em dezenas de outros. isso é um detalhe que muita gente nem percebe.

  9. Olá
    Gostaria de agradecer o seu post e dizer que ele me ajudou muito a resolver um problema com Flash e PHP. É uma pena que demorei tanto para encontrar este link.
    Parabéns
    Att
    Valdek Junior

  10. Pessoal, até postei a reposta no outro fórum, mas fiquei feliz por ter conseguido corrigir um problema. No flash selecione o texto onde o acento não aparece clique em EMBED depois com a tecla CTRL pressionada selecione as opções: Uppercase, Lowercase, Nemerals, PUNCTUATION, Basic Latin.Na opção “Include those characters:” logo abaixo das opções já citadas e resolvi arriscar, inseri “ÃÀÁÂÈÉÊÕÒÓÔÍÌÚÙÇ” nesta caixa, depois cliquei em ok. Deu certo, só resolveu depois que escrevi os caracteres manualmente.

  11. O mais bem explicado até agora. Parabéns.

  12. A melhor explicação até agora. Parabéns.

  13. Cara, funcionou que é uma beleza. Tava usando o AMFPHP, FLASH BUILDER E POSTGRES…. VALEW

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>