Como converter GB2312 (ou outros caracteres não ANSI) para codificação UTF-8 (My MySQL e Files Charset)
Meu primeiro site steakovercooked.com começou em 2006 (9 anos atrás). E naquela época, eu não sabia muito sobre a codificação/charset de arquivos e também, o UTF-8 não era tão popular para páginas da web naquela época. Atualmente, o UTF-8 se torna tão popular, ou seja, o WordPress usa a codificação UTF-8 em todo o site para que você possa exibir virtualmente qualquer idioma em um site sem problemas.
UTF-8-ascii-iso-8859-1
A página de código de todos os arquivos (PHP, HTML, CSS e alguns outros arquivos de texto simples) estavam principalmente em páginas de código ANSI e os caracteres chineses são codificados em vários bytes. Para exibir esses caracteres (em codificação ANSI) no navegador, você precisaria colocá-los entre a tag de cabeçalho em HTML para que os navegadores possam entender:
Em HTML5, você pode escrever em um método muito mais curto:
Portanto, a maioria dos falantes não chineses não podem ver os caracteres, a menos que instalem o pacote de idioma GB2312 para o navegador. Além disso, é provável que alguns editores de texto comuns estraguem os caracteres. Um único caractere em chinês tem dois bytes, mas às vezes o editor de texto apenas corta ao meio.
Converter arquivos (ANSI) para UTF-8
Antes de alterar o meta-cabeçalho para:
Você precisaria converter os arquivos em codificação UTF-8. Há muitas maneiras de fazer isso. O método mais simples seria usar o bloco de notas para salvar como codificação ‘UTF-8’.
bloco de notas-converter-para-utf-8
Se você tiver muitos arquivos, poderá fazer isso usando o utilitário iconv no Linux (VPS Server ). O script a seguir (salvo no nome do arquivo, por exemplo, toUTF) converterá um único arquivo em UTF-8.
#!/bin/bash
# https://helloacm.com
if [ "$#" -ne 1 ] ||! [ -r "$1" ]; then
echo "Usage: $0 file1"
exit 1
fi
x=`file -bi $1 | grep 'utf' | wc -l`
if [ $x -eq 1 ]; then
echo "$1 already converted"
else
echo converting $1 to UTF8
iconv -f "gb2312" -t "UTF-8" $1 -o $1
fi
Precisamos evitar converter duas vezes para evitar possíveis problemas. O file -bi $1 | grep 'utf' | wc -l
irá verificar se o arquivo já foi codificado em UTF-8. O comando iconv -f “gb2312" -t “UTF-8" $1 -o $1 converterá o arquivo para UTF-8 de gb2132 (altere isso de acordo).
Agora, podemos fazer um loop de todos os arquivos com extensões de arquivo *.php no diretório atual e em todos os subdiretórios:
for x in `find. -type f -name "*.php"`; do
toUTF $x
done
Converter banco de dados MySQL para UTF-8
No meu caso, todos os meus bancos de dados mysql anteriores são padronizados para a codificação ANSI (collation latin1_swedish_ci) ele fica corrompido nos navegadores modernos se houver caracteres GB2312 (multi byte). Por exemplo, PhpMyAdmin tem codificação UTF-8 e os caracteres ANSI/GB2312 serão mostrados corrompidos no navegador.
Para salvar esses dados em UTF-8, o método mais fácil é exportar a tabela (recomenda-se o phpMyAdmin) para um arquivo SQL; certifique-se de exportá-lo usando iso 8859-1 (cobertura completa do inglês). iso 8859-1 também é conhecido como ANSI, mas os caracteres GB2312 podem ser armazenados como string de vários bytes. Se você abrir o SQL no bloco de notas, ainda poderá ver os caracteres chineses, basta salvar como codificação ‘UTF-8’.
phpmyadmin
Ah, mais uma coisa antes de salvar como UTF-8. Você deve pesquisar e substituir a palavra “latin1” por “utf-8” no arquivo SQL. Em seguida, reimporte o SQL usando o phpMyAdmin para que você esteja pronto. Todos os dados serão preservados e alterados para a codificação UTF-8 e o agrupamento será alterado (para varchar, text, longtext etc) para utf8_general_ci.
Configurações do MySQL UTF-8
No PHP, você pode definir o conjunto de caracteres padrão:
mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET utf8");
O mysql_set_charset faz o mesmo:
Você também pode definir o conjunto de caracteres padrão quando o servidor MySQL iniciar (salve as sobrecargas de função para chamar as funções acima). Vá para editar o arquivo /etc/mysql/my.cnf e reinicie o servidor mysql, por exemplo , sudo service mysql restart. Adicione o seguinte a my.cnf :
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
collation-server = utf8_unicode_ci
init-connect='SET NAMES utf8'
character-set-server = utf8
Por que UTF-8?
O UTF-8 trata letras alfabéticas de 1 byte (o mesmo que ANSI), mas usa 3 bytes para representar 1 caractere chinês enquanto 2 bytes são usados se codificados por GB2312. Portanto, se suas páginas contiverem muitos caracteres chineses, o ANSI/GB2312 economizará espaço, no entanto, UTF-8 e ANSI consumirão exatamente o mesmo espaço quando se trata apenas de letras em inglês.
O UTF-8 evita problemas no futuro. Depois de converter para UTF-8, você não precisa se preocupar com o conjunto de caracteres ou a codificação. UTF-8 é mais internacionalmente amigável com caracteres que a maioria dos navegadores sabe como exibir o texto corretamente. No meu caso, tenho que converter os arquivos em codificados em UTF-8 porque meus editores de texto favoritos, tanto o PsPAD quanto o texto Sublime, não sabem como exibir o ANSI/GB2312 corretamente.