Mi sembra che la libreria YAML fornita con Ruby 1.9 sia codifica-sorda.Ruby 1.9, YAML e string encodings: come condurre una vita di sanità mentale?
Ciò significa che durante la generazione di YAML prenderà qualsiasi stringa di byte ed eviterà qualsiasi sequenza di byte che non restituisca ASCII pulito. È zoppo, ma accettabile.
Il mio problema è il contrario. Quando si carica il contenuto da detto dump YAML.
Nell'esempio che segue creo una stringa UTF-8, esegui il dump, viene scaricata con il tipo !binary
. Quando lo carico, ha la codifica ASCII-8BIT. Alla fine dell'esempio cerco di concatenare sia la stringa originale che quella ricaricata con un'altra stringa UTF-8. Quest'ultimo fallirà con un Encoding::CompatibilityError
.
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
penso che sia chiaro come questo porterà rapidamente a problemi quando hai a che fare con qualche fonte YAML contenente hash nidificati e array di stringhe con foglia.
Attualmente ho un codice che attraversa tutti gli hash e gli array e chiama force_encoding
su ogni stringa. Quello, per non dire altro, è antiestetico.
Quello che sto cercando in questo momento è un modo per dire che YAML::load
qualsiasi stringa che viene in dovrebbe essere trattata come, e quindi hanno la sua codifica UTF-8.
Idealmente, lo YAML di Ruby dovrebbe solo annotare le stringhe con la corretta codifica. C'è un progetto Ya2YAML che tenta di scaricare YAML in modalità UTF-8. Non sono sicuro di quanto sia lungo. Se qualcuno ha giocato con esso, accolgo qualsiasi pensiero.
Indipendentemente da ciò, ho ancora questi dump senza informazioni di codifica da gestire. Anche se so che sono tutti UTF-8.
+1 per le dieresi di metalli pesanti. –
Mi sono imbattuto nello stesso bug/comportamento ... Hai trovato un'altra soluzione o stai ancora solo facendo YAML.load e poi force_encoding ('utf-8') su ogni stringa? – severin