Iconv: convertendo a codificação de uma String
Olá a todos.
Durante o desenvolvimento do Guiaville, nos deparamos com muitos problemas. Um deles foi a codificação de caracteres, o qual apresentou um comportamento estranho depois que publicamos. Como os testes foram feitos fora de produção, não conseguimos detectar o problema.
Antes da correção, se você procurasse por tattoo no Guiaville, um dos resultados apresentava o seguinte problema:

Antes das reticências, existe um ícone de ? (no Mozilla Firefox). Bem, isso aconteceu por que cortamos o resultado para aparecerem apenas os primeiros 190 caracteres da descrição. Até aí tudo certo, se não fosse o fato dos acentos serem contados como dois caracteres. É só fazer o teste com a função strlen(). Cada letra acentuada (ou cedilha) equivale a dois caracteres. Isso é claro, em UTF-8, codificação que trabalhamos.
A solução é o iconv, uma biblioteca de conversão de codificações. Para comprovar a eficácia, façamos o teste:
<?php $texto = "Olá, isto é um teste de codificação"; echo "Tamanho de \$texto com strlen(): " . strlen($texto); echo "<br />"; echo "Tamanho de \$texto com iconv_strlen(): " . iconv_strlen($texto, 'UTF-8'); ?>
O resultado:
Tamanho de $texto com strlen(): 39 Tamanho de $texto com iconv_strlen(): 35
Então, para podermos efetuar o corte dos 190 primeiros caracteres da descrição, utilizamos a função iconv_substr(). Veja o comparativo:
<?php $texto = "Olá, isto é um teste de codificação"; echo substr($texto, 0, 35); echo "<br />"; echo iconv_substr($texto, 0, 33, 'UTF-8'); ?>
O resultado:
Olá, isto é um teste de codifica� Olá, isto é um teste de codificaç
Desta maneira, podemos cortar a string onde quisermos, sem nos preocupar com o maldito caracter �.
Até mais,
Rafael.
