24 set 2017

Alterar encoding de arquivos em massa

jmfp6beQuem trabalha com frequencia com a linguagem de programação php e recebe ou encontra códigos fonte implementados por outros usuários, geralmente enfrenta um problema: a codificação dos caracteres.

Tendo este tipo de problema, criei 4 snippets simples para mudança de codificação dos arquivos em massa.

Os comandos unix básicos utilizados são o file e o comando iconv respectivamente com os seguintes argumentos file -i filename (que mostra algumas informações como o tipo de codificação do arquivo) e o comando iconv infile -f iso-8859-1 -t utf8 -o outfile.

Por que 4? Bom, pensando em uma lógica melhor, alguém pode criar um apenas e que faça todas as análises necessárias antes da ação, mas vamos lá:

  • Caso 01 – Em termos de codificação de caracteres [google](http://google.com) `charset` todos os arquivos são homogêneos, ou seja possuem a mesma codificação `charset=iso-8859-1` e deseja-se convertê-la para `charset=utf-8`:

[code language=”bash”]
for i in $(find -name \*.php);
do
iconv $i -f iso-8859-1 -t utf-8 -o $i;
done
[/code]

  • Caso 02 – Em termos de codificação de caracteres`charset` todos os arquivos são homogêneos, ou seja possuem a mesma codificação `charset=us-ascii` e deseja-se convertê-la codificação para `charset=utf-8` :

[code language=”bash”]
for i in $(find -name \*.php);
do
iconv $i -f us-ascii -t utf-8 -o $i;
done
[/code]

  • Caso 03 – Em termos de codificação de caracteres`charset`  os arquivos **não são** homogêneos, ou seja uns possuem a mesma codificação `charset=iso-8859-1` e outros não e deseja-se converter a codificação para `charset=utf-8` :

[code language=”bash”]
for i in $(ls)
do
file -i $i | grep ‘iso-8859-1’ >> /dev/null

if [ $? -eq 0 ]
then
iconv $i -f iso-8859-1 -t utf8 -o $i;
fi
done
[/code]

  • Caso 04 – Em termos de codificação de caracteres`charset`  os arquivos não são homogêneos, ou seja uns possuem a mesma codificação `charset=us-ascii` e outros não e deseja-se converter a codificação para `charset=utf-8` :

[code language=”bash”]
for i in $(ls)
do
  file -i $i | grep ‘us-ascii’ >>/dev/null

if [ $? -eq 0 ]
then
iconv $i -f us-ascii -t utf8 -o $i
fi
done
[/code]

Bueno, é isso hoje.
Ps: Caso alguém queira fazer um script mais genérico e com opções de argumentos como entrada, será bem vindo.

Leave a Reply