Acentuação em formulário Flash com PHP

LINKS PATROCINADOS

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(‘<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

LINKS PATROCINADOS
Veja uma seleção dos 10 melhores artigos que temos sobre este assunto:
Pesquisa personalizada

16 comentários

  1. crydy disse:

    Olá tentei adaptar este código no meu script:

    $mensagem = ‘Mensagem: ’ . utf8_decode($_POST[’mensagem’]) . “”;

    Mas não obtive sucesso, não sei exatamente o que modificar; este é meu script:

    Se puder me ajudar ficaria muito grato.
    Obrigado pela atenção.

  2. Marcela disse:

    ótimo artigo, me ajudou demais!!!! obrigada, marcela

  3. Saudações ao amigo; excelente matéria a sua.
    Tenho um formulário em SWF onde apliquei a ele parâmetros de transparência lá no Dreamweaver (parameter = wmode e value = transparent)

    para colocá-lo em um fundo onde há uma foto (http://www.protequniformes.com.br/pagFormulario.html). Ao colocá-lo na rede passo a ter problemas

    quando digito nos campos do formulário os acentos “~” e “´” – eles são substituídos por outros sinais. Isso só ocorre no Mozilla Firefox; no IE tudo

    funciona bem.
    Como corrigir tal problema?
    http://www.protequniformes.com.br/pagFormulario.html
    Desde já agradeço.

  4. Já sabia por alto do “problema”, mas esse artigo foi muito útil para eu poder entender melhor sobre o assunto! Obrigado e parabéns!

  5. guilherme disse:

    Onde utilizo o utf8_decode()?

    Utilizo no flash a variável:
    loadVariablesNum (“http://www.xxxx.com/msgpaciente.php”, 0, “POST”);

    No arquivo PHP uso:
    “);
    mail($email, “xxxx | Confirmação de recebimento de e-mail.”,”Resposta automática. Não é necessário responde-la.\n

    Obrigado,

    \n

    “, “From: “);
    ?>

  6. Marcelo Sales disse:

    Mais completo impossível…

    Até que enfim achei um artigo que explica pq não funciona, pq funciona, etc… Não aguentava mais descrições e explicações que no fundo não explicavam nada…

    Parabéns pelo artigo e pelo site!!!

    Abraços
    Marcelo

  7. Robson disse:

    Tenho o seguinte código, onde utilizo o utf8_decode()?

    <?
    $Name = ereg_replace(“[^A-Za-z0-9 ]”, “”, $Name);
    $Email = ereg_replace(“[^A-Za-z0-9 \@\.\-\/\’]”, “”, $Email);
    $Comments = ereg_replace(“[^A-Za-z0-9 \@\.\-\/\’]”, “”, $Comments);

    $Name = stripslashes($Name);
    $Email = stripslashes($Email);
    $Comments = stripslashes($Comments);

    if ($Submit == “Yes”) {
    $filename = “GuestBook.txt”;

    $fp = fopen( $filename,”r”);
    $OldData = fread($fp, 80000);
    fclose( $fp );

    $Today = (date (“l dS of F Y ( h:i:s A )”,time()));

    $Input = “Nome: $NameEmail: $EmailComentario: $CommentsData: $Today.:::.”;

    $New = “$Input$OldData”;

    $fp = fopen( $filename,”w+”);
    fwrite($fp, $New, 80000);
    fclose( $fp );
    }

    $filename = “GuestBook.txt”;

    $fp = fopen( $filename,”r”);
    $Data = fread($fp, 80000);
    fclose( $fp );

    $DataArray = split (“.:::.”, $Data);

    $NumEntries = count($DataArray) – 1;

    print “&TotalEntries=$NumEntries&NumLow=$NumLow&NumHigh=
    $NumHigh&GuestBook=”;
    for ($n = $NumLow; $n < $NumHigh; $n++) {
    print $DataArray[$n];
    if (!$DataArray[$n]) {
    Print “Não há mais mensagens”;
    exit;
    }
    }
    ?>

  8. Nathiel disse:

    estou com este problema em um XML

    o site é todo em flash e XML só que coloco os acentos e Ç ele não aceita.

    como posso acertar issu???

    Espero pela ajuda

    Att
    Nathiel Ferreira Brusgui

  9. Elcio disse:

    Show bela dica….

  10. Elcio disse:

    Excelente fica, abraços!

  11. Daniel Lima disse:

    Muito bom, até agora, resolveu meu problema =D

  12. Jesse disse:

    excelente artigo, resolveu meu problema !!

    parabens e meu muito OBG !

  13. Elza Pereira disse:

    Tentei utilizar:
    $mensagem = ‘Mensagem: ’ . utf8_decode($_POST[‘mensagem’]) . “”;
    No PHP que uso:
    $contato_mensagem = utf8_decode($_POST[‘mensagem’]) ;
    mas não funciona.
    Ao digitar a mensagem (Firefox 3, Opera, Safari 4, Chrome) não reconhece acentuação e na minha caixa postal o conteúdo da mensagem ficou em branco (vazio), recebi apenas o nome, email, assunto.

    Uso Action 3.0, e o formulário funcionava normalmente. Apenas no IE7 e IE8 ao digitar no form a acentuação é perfeita, mas em qualquer navegador recebo com caracteres desconfigurados.

    Ainda sem solução.

  14. Leandro Torneri disse:

    MUITÍSSIMO Obrigado, resolveu totalmente o meu problema! Gde abraço e obrigado novamente!

  15. Herlon disse:

    Pesquisei muito na net e nunca achei um artigo tão claro sobre este assunto.
    Ajudou muito!

    Parabéns e obrigado!

  16. Marcos disse:

    Muito importante essa dica, estava quase colocando uma observação no site para não enviarem textos acentuados.
    Uma pequena dica que a mais e três anos vem sendo utilizada. Muito obrigado.

Deixe seus comentários