rails invalid ruby-on-rails ruby ruby-on-rails-4 ruby-2.0

ruby on rails - invalid - Ruby 2.0.0 String#Match ArgumentError: secuencia de bytes no válida en UTF-8



invalid byte sequence in utf-8 rails (2)

Veo esto mucho y no he encontrado una solución elegante. Si la entrada del usuario contiene secuencias de bytes no válidas, necesito poder hacer que no genere una excepción. Por ejemplo:

# @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

Se han formulado numerosas preguntas similares y el resultado parece ser la codificación o la codificación forzada de la cadena. Ninguno de estos me funciona, sin embargo:

regex.match(@raw_response.force_encoding("UTF-8")) ArgumentError: invalid byte sequence in UTF-8

o

regex.match(@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?")) ArgumentError: invalid byte sequence in UTF-8

¿Es esto un error con Ruby 2.0.0 o me falta algo?

Lo que es extraño es que parece estar codificando correctamente, pero la coincidencia continúa generando una excepción:

@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?").encoding => #<Encoding:UTF-8>


Como usa Rails y no solo Ruby, también puede usar tidy_bytes . Esto funciona con Ruby 2.0 y también probablemente te devuelva datos sensibles en lugar de solo caracteres de reemplazo.


En Ruby 2.0, el método de encode no funciona cuando se codifica una cadena a su codificación actual:

Tenga en cuenta que la conversión de una codificación enc a la misma codificación enc es no operativa, es decir, el receptor se devuelve sin ningún cambio y no se generan excepciones, incluso si hay bytes no válidos.

Esto cambió en 2.1, que también agregó el método de scrub como una manera más fácil de hacer esto.

Si no puede actualizar a 2.1, tendrá que codificar en una codificación diferente y volver para eliminar los bytes no válidos, algo así como:

if ! s.valid_encoding? s = s.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode(''UTF-8'') end