Lidar com a codificação de outras fontes

Codificar é uma merda. Sempre. Não há nenhum argumento sobre isso.

Meu conselho a todos vocês rubistas por aí, se você lida com entradas de outras fontes, como ao analisar outros sites e coisas que podem ter codificações diferentes, codifique novamente a entrada para evitar erros como

ArgumentError: invalid byte sequence in UTF-8

Como?

No Ruby 1.9 você pode fazer isso com String#encode. A documentação desse método carece de opções de alguma forma, mas basta olhar para este trecho de linha:

unsafe_string.encode!('UTF-8', 'UTF-8', :invalid => :replace, :replace => '')

Isso recodifica o unsafe_string e simplesmente exclui todas as sequências de bytes, que não podem ser entendidas por UTF-8. Portanto, é menos provável que seu código falhe com este ArgumentError.

No Ruby 1.8, você tem que usar o Iconv para obter este resultado, aqui está como poderia ser:

ic = Iconv.new('UTF-8//IGNORE', 'UTF-8')
safe_string
= ic.iconv(unsafe_string)

Pelo que entendi, essa Iconvabordagem ainda falhará se a sequência de bytes inválida estiver no final da string. Mas isso pode ser contornado. Paul Battley está mostrando como .