Detectando strings unicode com a função mb_detect_encoding

A função mb_detect_encoding nos permite detectar qual a codificação de uma determinada string. Na prática, para nós falantes de português, quase sempre queremos é saber se um texto está codificado como Unicode (UTF-8) ou não (quase sempre ISO-8859-1).

A função é usada da seguinte forma:

$codificacao = mb_detect_encoding($string, $lista_codificacoes, $strict);

  • $string – é a string que você quer descobrir a codificação
  • $lista_codificacoes – é a lista de codificações possíveis. A função apenas lhe dirá se a string está codificada em alguma das codificações informadas. São informadas em uma string com codificações separadas por vírgula ou um array delas.
  • $strict – ainda não sei bem o que faz. Mas é opcional, e o default é falso. Nunca me fez falta.

Peculiaridades

A ordem das codificações também importa, pois os testes usados para confrontar a codificação com a string podem bater para mais de uma codificação. Para descobrir se a string $str está codificada como utf-8, use:

$encoding = mb_detect_encoding($str, "UTF-8, ISO-8859-1");

O retorno será sempre a codificação detectada (no caso, “UTF-8″ ou “ISO-8859-1″). Devido a um bug na função, a codificação não é detectada corretamente quando a última letra for acentuada. Para contornar esse problema, podemos colocar mais uma letra:

$encoding = mb_detect_encoding($str . 'x', "UTF-8, ISO-8859-1");

Dessa forma, o valor da variável $str também permanece preservado.

Onde usar?

No PHP 6 isso deve mudar, mas enquanto não chegamos lá, a maioria das funções de manipulação de strings do PHP não funciona bem com strings Unicode. Com isso se faz necessário decodificá-las antes de usar tais funções. Mas as funções utf8_encode e utf8_decode são “burras”, se você mandar decodificar algo que não está codificado, sua string ficará corrompida.

Mas e se você usar a função mb_detect_encoding para fazer uma conversão seletiva?


function selective_utf8_decode ($str) {
if (mb_detect_encoding($str . 'x', "UTF-8, ISO-8859-1") == 'UTF-8') {
$str = utf8_decode($str);
}
return $str;
}

Mas é só unicode?

Falei muito de unicode aqui, mas essa função detecta várias outras codificações que usam mais de um byte por caracter (daí o mb, de multi-byte). Se você tem interesse em saber mais sobre isso, visite a página de referência da função mb_detect_encoding no site oficial do PHP.

  • Share/Bookmark

Posts relacionados

Deixe um comentário