Detectando encoding de arquivos em aplicações ruby

Se você possui uma entrada de dados onde o encoding é desconhecido ou variado então você já sabe que detectar o encoding correto pode ser problemático.

Enquanto você pode forçar os navegadores a sempre enviarem parâmetros em UTF-8, você não possui essa alternativa quando está lidando com upload de arquivos.

Nesse caso temos as seguintes alternativas:

  1. Obrigar o arquivo a ser sempre enviado em um encoding específico;
  2. Perguntar o encoding ao usuário final;
  3. Utilizar alguma heurística para detectar o encoding;

Se o seu usuário não for um usuário técnico, você definitivamente terá problemas com as duas primeiras opções.

Pensando na heurística, você pode utilizar o ICU para realizar esse trabalho.

E já que estamos falando de aplicações ruby, a recomendação é a gem charlock_holmes para detectar o encoding do arquivo.

A utilização é bem simples, basta enviar o conteúdo para o detector:

content = File.read('example.txt')  
detection = CharlockHolmes::EncodingDetector.detect(content)  

Tudo que precisamos então é converter esse dado para o encoding que queremos.

Apenas lembrando que se o charlock holmes não conseguir detectar o encoding ele retornará nil e você precisará lidar com isso de alguma maneira, exemplo:

content = File.read('example.txt')  
detection = CharlockHolmes::EncodingDetector.detect(content)

if detection.nil?  
  raise ArgumentError, "Can't detect encoding"
end

content = CharlockHolmes::Converter.convert(  
  content,
  detection[:encoding],
  'UTF-8'
)

Lembrando que como a gem faz uso do libicu, você precisará instalar os pacotes de acordo com o seu sistema operacional.

Para Linux e OS X as instruções estão no README enquanto as instruções para o Heroku estão no wiki aqui.

See ya!

Referências:

  1. http://site.icu-project.org
  2. https://github.com/brianmario/charlock_holmes
  3. http://tooky.co.uk/using-charklock_holmes-on-heroku/
  4. http://genius.it/5099323/tooky.co.uk/using-charklock_holmes-on-heroku?