Artigo: Acentos e Caracteres Especiais com PHP - Gigasystems

PHP

Em por

acentos-e-caracteres-especiais-com-php
Acentos e Caracteres Especiais com PHP

Ao usar um editor de texto que permita acentuação para criar uma página, corremos o risco dos acentos não serem interpretados corretamente por alguns browsers, em especial, browsers instalados em países onde não se utiliza acentuação, como os Estados Unidos, por exemplo. Se quisermos garantir que a acentuação da nossa página seja universalmente entendida devemos usar as entities.

Nas entities faz diferença usar caracteres maiúsculos ou minúsculos. Na verdade, entities é o único caso onde a HTML é case-sensitive. É verdade também que é muito trabalhoso colocar as entities ao invés de usar diretamente os caracteres acentuados, mas alguns editores (como o ckeditor, por exemplo) permitem que digitemos os acentos e eles se encarregam de converter para as entities.

Se o seu Banco de Dados contém sequências em duas codificações diferentes por algum motivo, seja de importação, exportação ou algum problema que não conseguiu detectar, o que eu faria?

Em vez de ficar chutando ou remendando seu código com detecção de caracteres e com funções de codificação e decodificação, utilize um script que irá ler todos os seus registros e atualizar as strings para o formato correto (eu escolheria UTF-8, se eu fosse você). Desta forma, seu código será mais limpo e simples de manter.

 function detect_encoding($string) { ////w3.org/International/questions/qa-forms-utf-8.html if (preg_match('%^(?: [\x09\x0A\x0D\x20-\x7E] | [\xC2-\xDF][\x80-\xBF] | \xE0[\xA0-\xBF][\x80-\xBF] | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} | \xED[\x80-\x9F][\x80-\xBF] | \xF0[\x90-\xBF][\x80-\xBF]{2} | [\xF1-\xF3][\x80-\xBF]{3} | \xF4[\x80-\x8F][\x80-\xBF]{2} )*$%xs', $string)) return 'UTF-8'; //If you need to distinguish between UTF-8 and ISO-8859-1 encoding, list UTF-8 first in your encoding_list. //if you list ISO-8859-1 first, mb_detect_encoding() will always return ISO-8859-1. return mb_detect_encoding($string, array('UTF-8', 'ASCII', 'ISO-8859-1', 'JIS', 'EUC-JP', 'SJIS')); } function convert_encoding($string, $to_encoding, $from_encoding = '') { if ($from_encoding == '') $from_encoding = detect_encoding($string); if ($from_encoding == $to_encoding) return $string; return mb_convert_encoding($string, $to_encoding, $from_encoding); } 

O uso desta função ficaria da seguinte forma:

 // se o terceiro parametro não for especificado o "from_encoding" ele será detectado automaticamente $newString = convert_encoding($oldString, 'UTF-8'); 

Converta cada campo (propriedade) da tabela (entidade) que desejar, usando o exemplo acima e faça UPDATE no BD. Você poderia fazer um script genérico e deixar no seu pendrive e sempre que aparecer uma pedra no caminho, recorra ao SCRIPT.


Outra forma de contornar o problema sem alterar os dados do BD.

Agora, se desejar usar sempre uma função, para que qualquer informação que venha do BD seja tratada no momento que for mostrar na tela, sugiro utilizar a função abaixo, que se o texto for escrito com acentuação normal, ou com os caracteres entities ( ex: "é", "ã" ), ele trata o texto corretamente para esses dois casos. A função é a seguinte:

 function charset_decode_utf_8 ($string) { /* Only do the slow convert if there are 8-bit characters */ /* avoid using 0xA0 (\240) in ereg ranges. RH73 does not like that */ if (! preg_match("[\200-\237]", $string) and ! preg_match("[\241-\377]", $string)) return $string; // decode three byte unicode characters $string = preg_replace("/([\340-\357])([\200-\277])([\200-\277])/", "'&#'.((ord('\\1')-224)*4096 + (ord('\\2')-128)*64 + (ord('\\3')-128)).';'", $string); // decode two byte unicode characters $string = preg_replace("/([\300-\337])([\200-\277])/", "'&#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'", $string); return $string; } 

E seu uso é bem simples:

 $seuTextoTransformado = charset_decode_utf_8($textoATransformar); echo $seuTextoTransformado;

Espero ter ajudado e se tiver dúvidas, não exite em entrar em contato que tentamos te ajudar!

Olá, deixe seu comentário para Acentos e Caracteres Especiais com PHP

Já temos 4 comentário(s). DEIXE O SEU :)
Tulio Batista

Tulio Batista

Muito legal o post, porém será que não existe uma tabela com todos os caracteres para quem não mexe em algum site UTF-8? Não acho de jeito nenhum na internet.
★★★★★DIA 17.03.23 10h50RESPONDER
N/A
Enviando Comentário Fechar :/
Robson Santana

Robson Santana

Eu acabo de inserir os scripts sem sucesso
★★★★★DIA 19.04.19 07h54RESPONDER
N/A
Enviando Comentário Fechar :/
Filipe Avelino

Filipe Avelino

Show de bola, wc rodando ai em! :D
★★★★★DIA 10.04.19 17h27RESPONDER
Marcos Martins
Enviando Comentário Fechar :/
Geraldo

Geraldo

Muito bom esse post, resolveu meu problema.
Obrigado
★☆☆☆☆DIA 31.03.16 11h03RESPONDER
N/A
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

Veja Também:

Artigos Relacionados a categoria: PHP

Soluções

...CURTIU? AINDA NÃO VIU NOSSO PORTFÓLIO?


Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite, veja agora mesmo nossos Cases de Sucesso e tenha seu site nos padrões atuais preparado para maioria dos dispositivos e navegadores.

Usamos cookies para manter o site seguro, registrar e personalizar sua navegação. Para mais detalhes sobre essa atividade, acesse nossa Politica de Privacidade

Entendi