(1.9 sous Windows)Contourner un comportement inattendu dans yaml pour Ruby - chaînes unicode internées
Reproduire:
require 'yaml'
s = YAML::load("\xEC\x86\x8C\xEB\x85\x80\xEC\x8B\x9C\xEB\x8C\x80")
# => "∞åîδàÇ∞ï£δîÇ" or "소녀시대", depending on your terminal's unicode support
s_interned = s.intern
s_interned.class # => Symbol
s_yamld = s_interned.to_yaml
# => "--- \":\\xEC\\x86\\x8C\\xEB\\x85\\x80\\xEC\\x8B\\x9C\\xEB\\x8C\\x80\"\n"
unyamld = YAML::load(s_yamld)
# => ":∞åîδàÇ∞ï£δîÇ" or ":소녀시대"
unyamld.class # => String
# => expected: Symbol
Et encore une fois:
YAML::load(s_interned.to_yaml).class # => String
Voici comment un « normal "symbole se comporte:
YAML::load(:foo.to_yaml).class # => Symbol
Les symboles normaux se comportent bien, mais les symboles avec caractères Unicode ne le semblent pas. Ils sont interprétés comme des chaînes avec un deux-points comme premier caractère. Je suis assez sûr que ce script fonctionnait hier soir. Mais je me suis réveillé ce matin et tout va mal.
Est-ce que quelqu'un sait comment je peux résoudre ceci ou contourner cela? J'ai essayé d'utiliser des expressions/sous-hacks réguliers intelligents pour contourner ce problème et "reconvertir", mais ils se sont tous révélés inélégants ou ont aggravé la situation.
À quoi sert votre fichier? Quel est votre encodage externe par défaut? Puisque vous utilisez Ruby 1.9 (présomption 1.9.2), vous pouvez vérifier l'encodage avec .encoding. –
@Luis Je suis tout nouveau à 1.9, donc l'encodage est assez étranger à moi. 's' est UTF-8; 's_yamld' est ASCII-8BIT. 'unyamld' est UTF-8. –