Resolvendo problemas com acentuação no php

Há alguns meses atrás estava desenvolvendo uma aplicação em php. Depois de finalizado fiz todos os testes em meu servidor apache local e aparentemente estava tudo certo. Porém quando eu subi o projeto para o host da hospedagem verifiquei que todas as palavras com acentuação especial(til, cedilha, circunflexo, etc.) eram exibidas de maneira desconfigurada. Percebi que isso acontecia devido à codificação padrão do servidor e a do meu projeto, que eram diferentes. E essas compatibilidades (ou a falta delas) entre as codificações iso-8859-1 e utf-8 podem acabar gerando muita “dor de cabeça” para programadores.

Certo. Mas o que e como fazer então?

Bom, primeiramente eu aconselho a sempre desenvolver em utf-8.

Mas e se o servidor não estiver configurado por padrão para essa codificação?

Simples. Para resolver isso você não precisa solicitar ao seu provedor de hospedagem alguma alteração nas configurações do servidor. Você poderá definir o utf-8 no seu próprio projeto.

No próprio cabeçalho HTML de seus documentos você pode fazer isso. Veja:

1
2
3
4
5
6
7
8
<html>
        <head>
               <title></title>
               <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        </head>
<body>
</body>
</html>

Na linha 4 eu defini que o documento deverá respeitar a codificação utf-8.

Porém não é 100% das vezes que o servidor aceita essa instrução HTML e continua “desconfigurando” caracteres especiais.

Em casos assim, ao invés de definir a codificação pelo cabeçalho HTML, defina através da função ini_set do próprio php.

1
2
3
<?php
 ini_set('default_charset','UTF-8');
?>

Pronto! Agora você pode fazer o upload de seus arquivos sem se preocupar.

Mas não se esqueça de declarar o charset antes de qualquer outra coisa. Isso evita erros de headers.

Abs.

Siga-me no twitter: @rafaelwendel

É formado em Sistemas de Informação, pós-graduado em Sistemas de Banco de Dados e mestre em Educação com foco em Tecnologias Sociocomunitárias. Trabalha como professor de ensino técnico e tecnológico no Instituto Federal de Educação, Ciência e Tecnologia de São Paulo ministrando disciplinas nas áreas de programação, banco de dados, desenvolvimento de projetos e engenharia de software.

Posts relacionados

Comentários

  1. Me ajudou bastante, depois de 2 horas tentando descobrir isso, achei a solução, simples e funcional. No meu caso, o site foi feito em utf8 e o provedor estava em outro formato, então só funcionou utilizando a função ini_set do próprio php. Abração e obrigado!

  2. Estou com problemas, pois meu banco é oracle e está em ISO-8859-1, E EU TENHO QUE INSERIR DADOS NO BANCO, JÁ MUDEI PARA UTF-8, POREM ELE JOGA CARACTERES ESPECIAIS NA HORA QUE DOU O REQUEST DO FORMULARIO, ANTES DE JOGAR NO BANCO, VC PODE ME AJUDAR.

  3. Poisé, eu não tive a mesma sorte. No meu caso, nenhuma das soluções resolveram.
    obs: Na minha página, existem vários momentos . Devo colocar o ini_set
    em todas ou basta na primeira ?
    O meu site de hospedagem é o Hostinger.
    Abç

  4. Olá Rafael, no meu caso na página funcionou perfeitamente mas quando utilizo o formulário para envio, chega no e-mail do cliente todo desconfigurado! O que poderia ser isso??

  5. meu site e em CMS, wp.
    So que coloquei nele um form em PHP nao nativo
    tratado por uma pagina externa.
    na hora que envio chega com os caracteres deformados.
    Por favor, amigos, onde eu posso mexer para que o form mailchegue com acentuacao certa no email do cliente?

  6. Obrigado Rafael. Finalmente graças a este detalhe você salvou meu dia. Agora é só criar uma função ou classe de correção dos acentos. 🙂 thank you.

  7. Olá! Rafael… tô com um problema que está tirando meu sono.
    Minha consulta não retorna os registros que contenham çÇ. Os demais acentos ele acha sem problema, procuro método ou metodo e ele encontra os registro com esta palavra acentuada ou não… mas o cedilha não tem jeito. Tem idéia do q seja?
    Abaixo algumas informações.
    Agradeço se puder ou não me ajudar.
    Seu Post foi muito útil.
    Milene

    Collation de conexão do MySQL utf8_general_ci
    Conjunto de caracteres MySQL: UTF-8 Unicode (utf8)
    nas páginas:

    Formato do DW6:
    Encoding: Unicode (UTF-8)
    Unicode Normalization Form: None
    Include Unicode Signature (BOM) desclicado.

  8. Boas estou com um grande problema com a acentuação do meu pequeno site.
    uma pagina Html com:
    Nome input type=”text”;
    Data saída input type=”text” com um calendario Dojo;
    Cancelar número de telefone : Sim Não (RadButton);
    Cancelar placa de dados : Sim Não (RadButton);
    Outros : (textarea).

    recebo os valores de todos dos campos num PHP, os dados exibidos no ficheiro php ficam corretos quando e efectuado o echo. o problema e quando crio um file .txt, tambem ja exprimentei num .html ele nao converte os acentos.

    Assim quando envio o file (txt ou html) num script de powershell, quando é recebido no email aparece sem acentos, mais propriamente as letras com acentos nem aparecem, veem em pontos de interrogação (?)

    Alguem me da uma ajuda

  9. Olá Rafael,

    Estou com um problema de acentuação no e-mail que recebo da página de Contato do meu site. Em todo o site os caracteres acentuados aparecem normalmente. Quando o cliente preenche os campos da página de Contato também fica tudo acentuado. Porém no e-mail que recebo, os caracteres acentuados e o cedilha vem todos errados.

    Já tentei as soluções que você apresentou acima e nada funcionou, ou só se eu é que estou fazendo alguma coisa errada. Estou listando as primeiras linhas dos meus arquivos HMTL e do PHP. Peço-lhe a gentileza de dar uma olhadinha e se notar alguma coisa errada, por favor corrija ou me indique o que fazer:

    Arquivo PHP:

    <?php

    $date = date("d/m/Y h:i");

    ini_set('default_charset','UTF-8');

    $msg_email = utf8_decode('Olá mundo éçãõ');

    Nas páginas HTML começa assim:

    Estou desesperado… risos

    Muito obrigado por qualquer ajuda ou dica.

    Atenciosamente,

    Lisandro

  10. Olá pessoal,

    Depois de inúmeras tentativas, acabei conseguindo, utilizando as dicas que obtive em diversos sites na internet.

    No PHP, coloque como a primeira linha:

    header(“Content-Type: text/html; charset=UTF-8”, true);

    Nos HTML, coloque após :

    Pode parecer meio estranho uma hora estar charset=UTF-8 e outra hora estar charset=iso-8859-1 mas foi somente exatamente assim que funcionou para mim. Até a linha de assunto vem corretamente acentuada!

    Espero poder ter ajudado outros colegas.

    Valeu,

  11. Estou colocando isso:

    Se eu tiro o :

    dá erro quando eu chamo o PHP do banco de dados e o html fica correto,porém se eu coloco, dá erro no html e o PHP fica correto. Como fazer para php e html ficarem corretos?
    Se eu tiro

  12. Bom dia Pessoal,
    Este tutorial acabou de ser muito prestável, ja tenho meu problema de lingua portuguesa resolvido.
    Agora gostaria de ter vossa ajuda como activar as base de dados para os sub-dominios en.uakidi.com.

    DS

  13. Olá Rafael, utilizei sua dica e os dados do formulário no corpo da mensagem chegam com os acentos reconhecidos, tive que utilizar $variavel = utf8_encode($variavel); no campo “assunto” do cabeçalho do e-mail pois somente com a declaração na abertura do php não rolou, mas os campos que tem “combobox” não funcionam mesmo, todos os dados vem com “?” no lugar dos acentos… Você teria alguma solução pra isso? Obrigada!

  14. Boa tarde!

    Me chamo Márcio Henrique Muzy Freitas, sou estudante de sistema de informação e programador júnior, estava num galho no sistema do TCC e o seu blog me ajudou e resolver esse galho, obrigado!

  15. Bom dia.
    Será que vc pode me ajudar?
    Tenho um formulário (montado no asp clássico) que está codificado com iso-9959-1.
    Uma página php (hospedada em outro servidor) recebe os dados deste formulário.
    Quando faço o request dos campos do formulário, eles vêm com símbolos e não consigo pegar o texto digitado no formulário corretamente.
    Não sei mais o que tentar….
    Obrigada

    1. esqueci de uma informação: a página php que recebe os dados está em utf-8.
      Já tentei trocar para iso-8959-1 mas não adiantou.
      Obrigada

  16. Sou novato, estava procurando algumas dicas aqui na net e tentei a de vocês mas não consegui.

    Um amigo me passou um linha simples para ser acrescentada e deu certo.

    Linha que já tinha no form —-> $mail = new PHPMailer;
    Acrescentei logo abaixo —-> $mail -> CharSet = ‘UTF-8’;

    Funcionou perfeitamente.
    Pode ser que a dica que passaram esteja certa mas eu não consegui usar ok? 🙂

  17. Oi!

    Estou desenvolvendo um sistema com Laravel e utilizando uma biblioteca para criar imagens. Ao criar as imagens, os acentos desconfiguram. É sabido que o servidor está em ISO-8859-1, mas já tentei colocar o ini_set( ‘default_charset’, ‘UTF-8’); e de nada adiantou. Tentei colocar até mesmo no index.php, já que o Laravel utiliza deste arquivo para carregar rotas e etc.

    Não sei o que fazer para solucionar o problema.

    Obrigado!

  18. Bom dia Rafael,

    Tenho 5 arquivos em php, sendo o de conexao.php com o bd, o form-bd.php, form-processamento.php, form-cadastro, form-listagem.
    Ao abrir o form-listagem, a relação dos textos que tem acentuação, aparecem com uma interrogação. Coloquei a linha de código que foi informado, mas não funcionou. Onde pode ser o erro?

  19. Eu mudei um sistema que comprei de um host para outro, mas agora no novo ele fica aparecendo os caracteres especiais.

    Posso pedir para o novo host (hostgator) mudar alguma configuração?

    Grato pelo ajuda

  20. Olá estou com um problema:
    Estou pegando dados da minha database porém, tudo vai certo menos os acentos, eles mudam para outras caracteres e mesmo colocando esse codigo ainda não funciona.
    Me ajuda.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *