So ändern Sie veraltet iconv zu String#encode ungültige UTF-8-Korrektur
Bekomme ich Quellen aus dem web, und manchmal ist die Kodierung des Materials ist nicht zu 100% UTF8-byte-Sequenz gültig. Ich benutze iconv stillschweigend zu ignorieren, diese Sequenzen zu erhalten, die gereinigte Zeichenfolge.
@iconv = Iconv.new('UTF-8//IGNORE', 'UTF-8')
valid_string = @iconv.iconv(untrusted_string)
Aber nun der iconv verworfen wurde, sehe ich die deprecation Warnung viel.
"iconv" wird als veraltet in die Zukunft, verwenden Sie String#encode
Ich habe versucht, die Konvertierung mit String#encode
's :invalid
und :replace
Optionen, aber es scheint nicht zu funktionieren (d.h. die falsche byte-Reihenfolge wurde nicht entfernt). Was ist der richtige Weg, um die Verwendung von String#encode für diese?
- Ich denke, was Sie versuchen, ist sehr gefährlich. Text-Kodierung ist wie Schwangerschaft: Sie haben entweder UTF8 oder nicht. Sie können nicht einfach ein "bit" in UTF8. Wenn es ein Fehler ist, Sie haben, um abzubrechen. Ansonsten ist Ihre Software ist möglicherweise anfällig für Angriffe mit böser Absicht vorbereitet strings.
- Ich Schreibe ein crawler, und es wird eine Seite dort, die ein bisschen ungültig. So die Reinigung der bytes ist alles, was ich tun kann.
InformationsquelleAutor lulalala | 2012-02-03
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die Frage, Martijn verbunden ist, was zu sein scheinen die zwei besten Möglichkeiten, das zu tun, aber Martijn gemacht eine verständliche, aber falsche ändern beim kopieren der zweite Ansatz, um seine Antwort hier. Tun .encode('UTF-8', <Optionen>).encode('UTF-8') nicht funktioniert. Wie in der ursprünglichen Antwort in der anderen Frage, der Schlüssel zu codieren, um eine verschiedenen Codierung, dann wieder zurück zu UTF-8. Wenn Ihr original-string ist bereits vorgemerkt als UTF-8 in ruby internals dann ruby ignorieren, die keinen Aufruf zu Kodieren, es als UTF-8.
In den folgenden Beispielen werde ich "a#{0xFF.chr}b".force_encoding('UTF-8') zu erzeugen, um eine Zeichenfolge, ruby glaubt, ist UTF-8, aber die enthält ungültige UTF-8-bytes.
Beachten Sie, wie die Codierung auf UTF-8 macht nix:
Aber Kodierung, die etwas anderes (UTF-16) und anschließend wieder auf UTF-8 bereinigt den string:
Diese wurde beantwortet diese Frage:
Gibt es eine Möglichkeit in ruby 1.9 zu entfernen Ungültiger byte-Sequenzen von strings?
Entweder
oder
wtf.encode('UTF-8', blah blah).encode('UTF-8')
zuerst Kodieren hat keine Wirkung, hier.