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

È stato utile?

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 codifica enc è 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top