Perdido?! Não sabe por onde começar? Conheça o AprendaPHP, um curso gratuito de PHP provido pelo PHPit!

PHPit - PHP

"Agora, pois, permanecem a fé, a esperança, o amor, estes três; mas o maior destes é o amor." (I Coríntios 13:13)

Detectando/descobrindo o charset/codificação de uma string - UTF-8, ISO-8859-1, etc.

Prefácio


Título longo (tem a ver com o Google? Magina!) mas tutorial bem simples. Recentemente enfrentei problemas com o UTF-8 (quem nunca enfrentou?) e testei vários modos de descobrir qual era a codificação usada, desde as gambiarras mais descaradas até as expressões regulares mais rebuscadas. Depois de muito bater a cabeça contra a mesa, cheguei a um resultado aceitável de como descobrir se a codificação da string era UTF-8 ou ISO-8859-1 utilizando strpos() e procurando pelo caractere à (uma vez que no português não existem palavras que comecei com "ã"), mas no fim das contas acabei percebendo que sempre tem alguém que envia uma mensagem totalmente em maiúsculo. Não vou simplesmente tacar um strtolower(). O jeito é pesquisar mais...

Conceito


Depois de muito dar socos na mesa e pesqusiar no meu amigo Google, chegou a hora do triste veredicto: caí em uma built-in function (funções que já vêm na linguagem). Nossa função se chama mb_detect_encoding() e, infelizmente, não irá funcionar a contento se não tiver um dedinho brasileiro ali.
A função só terá um resultado satisfatório se forem observados dos detalhes:

1. O segundo parâmetro da função (encoding list) deverá ser rigorosamente passado, contendo os dois encodes possíveis, a saber: UTF-8 e ISO-8859-1.
2. O último caractere da string não pode ser acentuado, para tanto utilizaremos um "método alternativo de eficácia momentânea" (vide Wikipédia: Gambiarra).

Mas e então, como fica? Vamos meter a mão na massa!

Mão na massa


Vamos montar uma funçãozinha bacana e bem simples, chamada codificacao() que irá retornar o charset de uma dada string. Talvez você perceba algo bizarro neste snippet, mas eu explico logo abaixo:

Código: Alternar entre o modo de cópia/destaque
  1. <?php
  2. function codificacao($string) {
  3. return mb_detect_encoding($string.'x', 'UTF-8, ISO-8859-1');
  4. }
  5. ?>
<?php
    
function codificacao($string) {
        return 
mb_detect_encoding($string.'x''UTF-8, ISO-8859-1');
    }
?>


Agora você me pergunta: O que raios aquele "x" está fazendo ali?
A resposta é muito simples. Lembra que eu comentei que a string não pode terminar em caractere acentuado? (Hahahahahahahahahaha!)
Procura no manual do PHP que foi um um francês que sugeriu essa implementação (que mesmo após o PHP corrigir o bug, a função continuará funcionando do mesmo jeito) e eu gostei. :)

Conclusão


Nem sempre é possível resolver problemas sem um "ajustezinho brasileiro". Resta-nos aguardar e ir atrás pra ver se um dia resolvem transpor este pequeno "detalhe" para o código-fonte do PHP! :P

Enviem críticas, dúvidas e sugestões, aproveitando que agora tem um formulário de contato meio enjambrado! xD

Um grande abraço a todos e fiquem com Deus!

Dim dim

 

Comentaí! (06)

Gostei do "x". Heheheh!!!

Muito massa!!

Flw! Kuen em 26/05/2008 às 13:57 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.14 no Windows Windows XP
Cara não consegui resolver o meu problema com esta abordagem, meu problema era ouuuuuutro na verdade, ehehe, mas essa função um dia com certeza vai ajudar, valeu! Anselmo Battisti em 27/05/2008 às 17:07 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.13 no Ubuntu Linux Ubuntu Linux
Cara, parabéns, adorei o artigo, linguagem leve e eficiente, e resolveu um problema que a muito tempo eu precisava solucionar.

Obrigado, e continue escrevendo.

Abraços Wesley Milan em 22/11/2008 às 14:41 utilizando o Mozilla Firefox Mozilla Firefox 2.0.0.12 no Windows Windows XP
>> Comentário #2
>> Autor: Anselmo Battisti
>> Em: 27/05/2008 às 17:07

>> Cara não consegui resolver o meu problema com esta
>> abordagem, meu problema era ouuuuuutro na verdade, ehehe,
>> mas essa função um dia com certeza vai ajudar, valeu!

OLHA AI HOJE ESSA FUNÇÃO ME AJUDOU, NÃO FALEI :) VALEU! battisti em 17/02/2009 às 21:33 utilizando o Mozilla Firefox Mozilla Firefox 3.0.4 no Ubuntu Linux Ubuntu Linux
Interessante :) CACA-[COBRA] em 12/05/2009 às 20:21 utilizando o Internet Explorer Internet Explorer 7.0 no Windows Windows XP
FANTÁSTICO!!!

Adorei a Gambiarra! re re re re Jonny Ken em 10/08/2009 às 19:26 utilizando o Mozilla Firefox Mozilla Firefox 3.0.13 no Windows Windows XP
 

Comenta logo, pô!

* Todos os links inseridos nos comentários possuem rel="nofollow" para impedir com que crawlers considerem os mesmos como relevantes.
* Os e-mails não são divulgados.

Dados pessoais

Você é realmente um humano?

Finalmente, digite seu comentário :)

Caixinha de Sugestões

O que é isso? Aqui você pode simplesmente digitar uma sugestão (artigos, resenhas, melhorias, etc) sem precisar preencher longos formulários. Digite o que quiser na caixinha abaixo e eu lerei com o maior prazer! Se quiser se identificar, fique a vontade!

O PHPit é redigido e mantido por Rafael Jaques - Política de Privacidade.

XHTML/CSS desenvolvido por André Gazola.

PHPit 2007 - 2009 - Alguns direitos reservados.

Feeds ;)

Creative Commons License

PHPit por Rafael Jaques é licensiado sob a Creative Commons Atribuição-Uso Não-Comercial-Compartilhamento pela mesma Licença 2.5 Brasil License.