Es scheint mir, dass die YAML-Bibliothek, die mit Ruby 1.9 ausgeliefert wird, kodierend-taub ist.Ruby 1.9, YAML und String Encodings: Wie führt man ein Leben in geistiger Gesundheit?
Dies bedeutet, dass beim Generieren von YAML eine beliebige Bytefolge und jede Bytefolge, die kein sauberes ASCII ausgibt, entkoppelt werden kann. Das ist lahm, aber akzeptabel.
Mein Problem ist anders herum. Wenn Inhalt von dem YAML-Speicherauszug geladen wird.
Im folgenden Beispiel erstelle ich eine UTF-8-Zeichenfolge, dump es, es wird mit dem Typ !binary
ausgegeben. Wenn ich es zurücklade, hat es die Codierung ASCII-8BIT. Am Ende des Beispiels versuche ich, sowohl die ursprüngliche als auch die neu geladene Zeichenfolge mit einer anderen UTF-8-Zeichenfolge zu verketten. Letzteres wird mit einem Encoding::CompatibilityError
fehlschlagen.
require 'yaml'
s0 = "Iñtërnâtiônàlizætiøn"
y = s0.to_yaml
s1 = YAML::load y
puts s0 # => Iñtërnâtiônàlizætiøn
puts s0.encoding # => UTF-8
puts s1 # => Iñtërnâtiônàlizætiøn
puts s1.encoding # => ASCII-8BIT
puts y # => --- !binary |
# ScOxdMOrcm7DonRpw7Ruw6BsaXrDpnRpw7hu
puts "ñårƒ" + s0 # => ñårƒIñtërnâtiônàlizætiøn
puts "ñårƒ" + s1 # => Encoding::CompatibilityError: incompatible character encodings: UTF-8 and ASCII-8BIT
Ich denke, es ist klar, wie dies schnell zu Problemen führen, wenn Sie mit einiger YAML Quelle zu tun haben verschachtelten Hashes und Arrays mit Blattzeichenketten enthalten.
Derzeit habe ich einige Code, der alle Hashes und Arrays durchlaufen und force_encoding
auf jeder Zeichenfolge aufruft. Das ist zumindest unansehnlich.
Was ich für jetzt suche, ist ein Weg, YAML::load
zu sagen, dass jede Zeichenfolge, die in kommen sollte so behandelt werden, und damit seine Codierung auf UTF-8 gesetzt hat.
Idealerweise sollte Rubins YAML nur die Zeichenketten mit der richtigen Kodierung versehen. Es gibt ein Ya2YAML-Projekt, das versucht, UTF-8-sicheres YAML auszugeben. Ich bin mir nicht sicher, wie weit es ist. Wenn jemand damit gespielt hat, begrüße ich alle Gedanken.
Unabhängig davon, habe ich immer noch diese Dumps ohne jegliche Kodierung Informationen zu bewältigen. Obwohl ich weiß, dass sie alle UTF-8 sind.
+1 für die Schwermetallumblätter. –
Ich renne nur in den gleichen Fehler/Verhalten ... Haben Sie eine andere Lösung gefunden oder machen Sie immer nur YAML.load und dann force_encoding ('utf-8') auf jeder Zeichenfolge? – severin