Dicas, tutorias, notícias sobre PHP, JS, jQuery, CSS, HTML, NodeJS, MySQL e muito mais
Problemas com charset

Problemas com charset

Fala galera beleza?!

hoje vou falar nesse post sobre um problema que com certeza vocês já enfrentaram ao decorrer do desenvolvimento de seus projetos… o maldito problema de charset aquelas palavras que são codificada de forma errada é acaba virando caracteres estranhos ou alguns pontos de interrogação como podemos ver na imagem abaixo.

 

icinga-doc-charset

 

Vamos lá a algumas dicas básicas para evitar futuros problemas, em nosso caso vamos nos basear em uma aplicação PHP usando um banco de dados MySQL

 

1º Dica – Defina qual charset você irá utilizar e não mude mais

Antes de iniciar o projeto defina qual charset você ira utilizar em seu desenvolvimento tanto em seus arquivos, código fonte e na estrutura do banco.. recomendo o uso do UTF-8 pois o mesmo abrange muito tipos de caracteres, mas já vi muita aplicação utilizando apenas o charset ISO-8859-1 (Latin-1) que suporta nossos “caracteres especiais” como acentos e derivados da nossa lingua, um exemplo é o próprio site da Receita Federal na ferramenta de consulta de CNPJ.. notem que no código fonte eles utilizam o charset ISO-8859-1… isso fica a critério de vocês, mas recomendo o uso do UTF-8 pode ser “mais pesado” mais abrange um numero de caracteres bem maior que o ISO-8859-1  em nosso post vamos utilizar o UTF-8 como referencia.

2º Dica – Salve seu código fonte em UTF-8

Escolha um bom editor de código fonte que lhe permita alterar a codificação do documento a ser salvo.

Observação: alguns editores dão a opção de salvar o arquivo com o BOM um desses editores é o Dreamweaver já tive muita dor de cabeça com isso, recomendo que não inclua esse bytes, pois os mesmo podem causar vários problemas na sua aplicação PHP como o uso da função header ou demais funções que devem ser a primeira coisa a ser declarada no script

3º Dica – Informe ao navegador qual o charset a ser usado

Essa é uma tarefa bem simples, temos dois casos nesse exemplo um arquivo PHP que gera um HTML, e uma pagina HTML estática.

em nosso primeiro caso quando geramos um HTML com o PHP é enviado ao navegador um cabeçalho (do protocolo HTTP) que informa o tipo do arquivo mime-type e sua codificação caso você não informe os tipos de ambos é enviado um default normalmente o mime-type como “text/html” e a codificação “ISO-8859-1”

Para mudar isso vamos utilizar a função header do php para informar qual a codificação que queremos o código é bem simples.

header('Content-Type: text/html; charset=UTF-8');
echo ''; // ... seu código vem aqui

utilizando essa simples função informamos ao navegador que a codificação a ser usada nos caracteres é a UTF-8

no segundo caso é bem simples também basta colocar uma meta tag dentro do cabecalho <head> do seu código HTML

 <html>
  <head>
   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

No HTML 5 o código ficou mais simples.

 <html>
  <head>
   <meta charset="UTF-8" ">

4º Dica – crie seu banco de dados em UTF-8

Os campos de texto armazenados no seu banco também utiliza uma codificação de caracteres, então para evitar futuros problemas de gravar valores “quebrados” no banco, também vamos cria-lo no mesmo padrão de codificação do nosso projeto

CREATE DATABASE fmansano CHARACTER SET UTF8;

5º Dica – comunique-se com seu banco através do charset definido

Caso sua aplicação utilize banco de dados, também informe na conexão qual codificação você deseja utilizar abaixo vou mostrar o código dos métodos mais usados

MySQL (PDO)

$conexao = "mysql:host=localhost;dbname=fmansano;charset=utf8";
$opcoes = array(
    PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8'
);
$pdo = new PDO($conexao, 'root', '', $opcoes);

MySQLi

$mysqli = new mysqli('localhost', 'root', '', 'fmansano');
$mysqli->set_charset('utf8'));

MySQL (Funções nativas) – Método depreciado!

$conexao = mysql_connect('localhost', 'root', '');
mysql_select_db('fmansano');
mysql_set_charset('UTF8', $conexao);

6º Dica – informe a codificação onde puder!

Como diz o ditado : “é melhor se prevenir do que remediar” então sempre que possível informe qual codificação você está utilizando.

Com expressões regulares PCRE, lembre-se de utilizar o modificador “u” ao final da expressão, indicando que ela é UTF-8

preg_match('/^[\w]/u', $string, $resultado);

no PHP um conjunto importante de funções, leva em consideração a localidade (com uma codificação) para funcionar. Então, também é importante definir a localidade adequadamente com a localidade UTF-8

a seguir segue como utilizar a função setlocale

/* Define o local para Português(Brasil) */
setlocale (LC_ALL, 'pt_BR.utf8');

/* Tenta diferentes nomes de local para o Português(Brasil) apartir do PHP 4.3.0 */
$loc_de = setlocale (LC_ALL, 'pt_BR', 'pt_BR.UTF-8', 'ptb', 'portuguese_brazil');

Lembrando que a função setlocale se comporta de forma diferente entre os sistemas operacionais

para usuário do Windows clique aqui para acessar a lista aceita pelo setlocale

Bom galera essa foi a dica de hoje, pratiquem isso e nunca mais iram ter problemas com charset!
espero ter ajudado, caso estejam com duvidas comentem o post! vlw 😀

Autor

fmansano

Desenvolver Web a mais de 5 anos, trabalha como freelancer, e analista de sistemas web, com experiências em varias linguagens de programação web, com o foco em PHP e Javascript/jQuery.

One comment

Deixe uma resposta

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