PHP

Em por

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!

Veja Também:

Artigos Relacionados a categoria: PHP

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

Já temos 1 comentário(s). DEIXE O SEU :)
Geraldo

Geraldo

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

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

Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite e veja agora mesmo e tenha um site de qualidade para o seu negócio!

[contato]
Ver o Portfólio Agora