Frage

Ich sehe das oft und habe keine anmutige Lösung gefunden.Wenn Benutzereingaben ungültige Bytefolgen enthalten, muss ich in der Lage sein, dass sie keine Ausnahme auslösen.Beispielsweise:

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

Es wurden zahlreiche ähnliche Fragen gestellt, und das Ergebnis scheint eine Codierung oder erzwungene Codierung der Zeichenfolge zu sein.Beides funktioniert bei mir jedoch nicht:

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

oder

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

Ist das ein Fehler mit Ruby 2.0.0 oder fehlt mir etwas?

Was seltsam ist, ist, dass es anscheinend korrekt codiert ist, aber match löst weiterhin eine Ausnahme aus:

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

Lösung

In Ruby 2.0 die encode Methode ist ein No-Op, wenn eine Zeichenfolge in ihre aktuelle Codierung codiert wird:

Bitte beachten Sie, dass die Konvertierung von einer Codierung enc zur gleichen Codierung enc ist ein No-op, d.h.der Empfänger wird ohne Änderungen zurückgegeben, und es werden keine Ausnahmen ausgelöst, auch wenn ungültige Bytes vorhanden sind.

Dies änderte sich in 2.1, was auch die hinzufügte scrub Methode als einfachere Möglichkeit, dies zu tun.

Wenn Sie nicht auf 2.1 aktualisieren können, müssen Sie in eine andere Codierung und zurück codieren, um ungültige Bytes zu entfernen, etwa:

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

Andere Tipps

Da Sie Schienen verwenden und nicht nur Ruby verwenden, können Sie auch tidy_bytes verwenden.Dies funktioniert mit Ruby 2.0 und bietet Ihnen wahrscheinlich wahrscheinlich sinnvolle Daten anstelle von nur Ersatzzeichen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top