Ruby 2.0.0 String # corrisponde ArgumentError: sequenza di byte non valida in UTF-8
-
21-12-2019 - |
Domanda
Vedo questo molto e non ho capito una soluzione graziosa.Se l'ingresso dell'utente contiene sequenze di byte non valide, ho bisogno di essere in grado di non sollevare un'eccezione.Ad esempio:
# @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
.
Numerose domande simili sono state invitate e il risultato sembra codificare o forzare la codifica della stringa.Nessuno di questi lavori per me comunque:
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
.
È un bug con rubino 2.0.0 o mi manca qualcosa?
Ciò che è strano sembra essere codifica correttamente, ma la corrispondenza continua a sollevare un'eccezione:
@raw_response.encode("UTF-8", :invalid=>:replace, :replace=>"?").encoding
=> #<Encoding:UTF-8>
. Soluzione
in Ruby 2.0 The Metodo encode
è un no-opQuando si codifica una stringa alla sua codifica corrente:
.Si prega di notare che la conversione da una codifica
enc
alla stessa codificaenc
è un no-op, cioè il ricevitore viene restituito senza alcuna modifica, e non vengono sollevate eccezioni, anche se ci sono byte non valide.
Questo è cambiato in 2.1, che ha anche aggiunto il Metodo scrub
Come un modo più semplice per farlo.
Se non si è in grado di eseguire l'aggiornamento a 2.1, dovrai codificare in una diversa codifica e ritorno per rimuovere byte non validi, qualcosa del genere come:
if ! s.valid_encoding?
s = s.encode("UTF-16be", :invalid=>:replace, :replace=>"?").encode('UTF-8')
end
. Altri suggerimenti
Dal momento che stai usando i binari e non solo Ruby puoi anche usare tidy_bytes.Questo funziona con Ruby 2.0 e probabilmente ti fornirà i dati sensati invece di solo caratteri di ricambio.