Um einen String in UTF-8 und ersetzen Sie alle Codierungsfehler zu konvertieren, können Sie tun:Wie kann ich UTF-8-Fehler in Ruby ersetzen, ohne in eine andere Kodierung zu konvertieren?
str.encode('utf-8', :invalid=>:replace)
Das einzige Problem dabei ist, es funktioniert nicht, wenn str
bereits UTF-8 ist, in denen Fall Fehler bleiben:
irb> x = "foo\x92bar".encode('utf-8', :invalid=>:replace)
=> "foo\x92bar"
irb> x.valid_encoding?
=> false
das Zitat Ruby Docs:
Bitte beachten Sie, dass die Umwandlung von einer Codierung
enc
auf die s eine Codierungenc
ist ein No-Op, d. h. der Empfänger wird ohne irgendwelche Änderungen zurückgegeben, und es werden keine Ausnahmen ausgelöst, selbst wenn ungültige Bytes vorhanden sind.
ist die offensichtliche Abhilfe zu einer anderen Unicode-Codierung zum ersten konvertieren und dann zurück in UTF-8:
str.encode('utf-16', :invalid=>:replace).encode('utf-8')
Zum Beispiel: zu tun
irb> x = "foo\x92bar".encode('utf-16', :invalid=>:replace).encode('utf-8')
=> "foo�bar"
irb> x.valid_encoding?
=> true
Gibt es eine bessere Art und Weise dies ohne Umwandlung in eine Dummy-Codierung?
Danke für die Info! Leider bin ich mit Ruby 1.9 fest und kann nicht upgraden (zumindest bei diesem Projekt). – Matt
Verwenden Sie das Juwel "scrub_rb" in früheren Versionen von Ruby –