Ruby 2.0.0 String#Corresponder ArgumentError:inválido seqüência de bytes de UTF-8
-
21-12-2019 - |
Pergunta
Eu vejo muito isso e ainda não descobri uma solução graciosa.Se a entrada do usuário contém inválido seqüências de bytes, eu preciso ser capaz de não gerar uma exceção.Por exemplo:
# @raw_response comes from user and contains invalid UTF-8
# for example: @raw_response = "\xBF"
regex.match(@raw_response)
ArgumentError: invalid byte sequence in UTF-8
Inúmeras perguntas semelhantes foram feitas e o resultado parece ser codificação ou de força codificação de seqüência de caracteres.Nenhum desses trabalhos, para mim, no entanto:
regex.match(@raw_response.force_encoding("UTF-8"))
ArgumentError: invalid byte sequence in UTF-8
ou
regex.match(@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?"))
ArgumentError: invalid byte sequence in UTF-8
Este é um bug com Ruby 2.0.0 ou eu estou faltando alguma coisa?
O que é estranho é que ele parece ser codificação corretamente, mas a correspondência continua a levantar uma exceção:
@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?").encoding
=> #<Encoding:UTF-8>
Solução
No Ruby 2.0 a encode
método é um não-op quando a codificação de uma seqüência de caracteres para sua codificação atual:
Por favor, note que a conversão a partir de uma codificação
enc
para a mesma codificaçãoenc
é um não-op, i.é.o receptor é devolvido sem quaisquer alterações, e sem ressalvas, mesmo se houver bytes inválidos.
Isso mudou em 2.1, que também acrescentou a scrub
método como uma maneira mais fácil de fazer isso.
Se você estiver não é possível a atualização para o 2.1, você vai ter que codificar em uma codificação diferente e volta, a fim de remover bytes inválidos, algo como:
if ! s.valid_encoding?
s = s.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
end
Outras dicas
Desde que você está usando Rails e não apenas Ruby você também pode usar tidy_bytes.Isso funciona com o Ruby 2.0 e também provavelmente vai lhe dar de volta sensata de dados em vez de apenas a substituição de caracteres.