utf8_decode e utf8_encode tratando com codificação Unicode

Olá pessoal, estou de volta para o terceiro post da série sobre tratamento de strings com PHP. Hoje falarei um pouco sobre os comandos utf8_decode e utf8_encode, trazendo uma melhor explicação para o uso feito no exemplo do post passado “strlen, desvendando os tamanhos de uma string”.

Só para lembrar, no post passado, utilizamos o comando utf8_decode para consertar a contagem de caracteres com acentuação. Sem a utilização deste comando, o strlen() acabava contando letras acentuadas como 2 caracteres. Mas, por que o comando utf8_decode()  resolve este problema? Que magia é essa?

Desvendando o utf8_decode

Como a segunda palavra já diz, o decode funciona para decodificar um determinado dado, passado como parâmetro, do formato utf8 para o ISO-8859-1. Sim, talvez o comando mais explicito seria utf-8_to_ISO-8859_decode(), mas acredito que isto seria muito grande para a função. Enfim, o fato é que o decode se limita à formatação ISO-8859-1, sendo assim se você não necessita utilizar este tipo de codificação já pode parar por aqui. Talvez este artigo não tenha nada a lhe acrescentar.

Dica: Se vocês está precisando fazer decodes com outros formatos você pode dar uma olhada no comando iconv().

Para todos os outros que desejam descobrir a razão do caractere acentuado retornar como 2 caracteres, a explicação é simples. O padrão utf-8 utiliza um padrão de valores entre 1 e 4 bytes, por caractere. Assim, quando temos caracteres do tipo á, é, í… os mesmos utilizam 2 bytes que são contados então, como 2 caracteres pela função strlen();

Dica: Se o texto a ser decodificado não estiver codificado em utf-8 o comando pode apresentar resultados indesejados.

O utf8_encode

O utf8_encode() faz exatamente o contrário da função utf8_decode, ela decodifica uma string no padrão ISO-8859-1 para o padrão utf-8. Assim uma determinada string do padrão latino pode ser utilizada juntamente com outros caracteres sem ocorrer erros de renderização. Aqueles famosos caracteres de interrogação (�).

Um Exemplo bem útil para o uso destes dois comandos é na criação de URLS amigáveis

function smartURL($str){
    $str = strtolower(utf8_decode($str)); $i=1;
    $str = strstr($str, utf8_decode('àáâãäåæçèéêëìíîïñòóôõöøùúûýýÿ'), 'aaaaaaaceeeeiiiinoooooouuuyyy');
    $str = preg_replace("/([^a-z0-9])/",'-',utf8_encode($str));
    while($i>0) $str = str_replace('--','-',$str,$i);
    if (substr($str, -1) == '-') $str = substr($str, 0, -1);
    return $str;
}

No exemplo acima o utf8_decode() foi utilizado para remover possíveis incompatibilidades com acentos e letras maiúsculas. A função basicamente remove caracteres maiúsculos com  strtolower(), remove qualquer acentuação com strstr(). Depois ele remove qualquer caractere que não sejam de a-z e 0-9 utilizando o preg_replace(). Por fim, substitui-se as duplicações de ‘-‘ e remove um possível ‘-‘ no último caractere com str_replace  e substr() respectivamente.

Concluindo, o utf8_decode e utf8_encode são funções auxiliares muito úteis para conversão entre caracteres latinos e o formato universal. Muitas vezes elas são utilizadas para tratamento de acentuações, e caracteres especiais inclusos no formato latino. Lembrando que se você não utiliza caracteres latinos, este comandos não terão nenhum efeito para sua aplicação.

Espero que tenha ajudado com esta explicação e até a próxima.Tenha todo o desempenho para o seu site com a Hospedagem Cloud DialHost. Servidores em cloud prontos para receber sites em PHP. Saiba Mais.