Vou explicar aqui como tornar seu site compativel com
UTF-8...
Você precisa entender que há várias camadas em que a codificação é utilizada, logo para usar corretamente o
UTF-8 é recomendado usar
UTF-8 em tudo...
Veja onde podemos informar a codificação de um texto:
- Cabeçalho HTTP Header -
Content-Type: text/html; charset=utf-8;
- Cabeçalho XML -
<?xml version="1.0" encoding="utf-8" ?>
- Cabeçalho HTML -
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" >
- Cabeçalho XHTML -
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
Lembrando que em regra o que vale mesmo é tudo menos o cabeçalho
HTTP, mas é complicado, porque depende do browser...
O cabeçalho
HTTP, pode ser informado pelo próprio
PHP ou pelo Apache através da seguinte linha no .htaccess:
AddDefaultCharset UTF-8
Agora onde que um servidor
PHP com
MySQL trata de codificações:
- O próprio código do PHP;
- A conexão PHP MySQL;
- O armazenamento dos dados no MySQL;
Para deixar o próprio código do
PHP em
UTF-8 basta usar um editor de texto que suporte
UTF-8, o Bloco de Notas do Windows serve, mas ele usa o
BOM, e isso atrapalha... Por isso use um editor que edite em
UTF-8 mas tenha opção de não gerar o
BOM, como o
Notepad2 ou o
Dreamweaver...
Para deixar a conexão do mysql basta usar:
mysql_set_charset('utf8',$link);
O uso de
SET NAMES não é recomendado nas versões novas do
PHP e
MySQL...
Já o armazenamento do
MySQL a mudança é feita na hora de criar o banco de dados ou a tabela com o
CHARACTER SET utf8;
Lembrando que o armazenamento
MySQL não precisa ser obrigatoriamente em
UTF-8, uma vez que podemos definir na conexão qual charset desejamos, é possível que a conexão seja
UTF-8, mas o
MySQL armazene em
Latin1, não sendo do tipo
BLOB o campo, o
MySQL faz a conversão do charset...
Um dos problemas de usar
UTF-8 no
PHP é que algumas funções falham ao executar comandos com o strtoupper e o strtolower, que em palavras acentuadas, deixa as letras acentuados sem alteração.
Outro problema que pode ocorrer é quando o usuário usa um editor
ISO-8859-1 para um site
UTF-8, o código gerado precisa do
utf8_encode...
Outro problema é quando o arquivo php é
Latin1 e a conexão do banco de dados é
UTF-8, e o usuário tenta substituir um texto no php, palavras acentuadas não são substituidas, porque a função procura por um caracter
Latin1, enquanto a string do banco de dados venho com caracteres
UTF-8....
Outro problema é quando o usuário exagera e usa vários
utf8_encode....
Outro problema é usar
htmlentities em uma string
UTF-8... Deve se usar
htmlspecialchars...
Outro problema, mas esse eu preciso confirmar é que no Javascript ao postar uma string, deve-se usar
encodeURIComponent e não
escape ou
encodeURI...
Tomando esses cuidados, metade dos problemas dos programadores
PHP desaparecem, e 80% dos problemas de usuários reclamando de letras estranhas também...
Nota: Latin1 é o ISO-8859-1 no MySQL por isso as vezes falo ele...
Sites:
http://www.w3.org/TR/2007/NOTE-i18n-html-tech-lang-20070412/
http://www.w3.org/International/tests/#lang-decl