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>
Foi útil?

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ção enc é 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top