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 Iconv
abordagem 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 .