2010-09-12 2 views
2

(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.

+0

À 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. –

+0

@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. –

Répondre

0

Je suis nouveau à 1.9 aussi, mais il semble que vous deviez parfois ajouter l'encodage au début du fichier. Quelque chose comme:

# encoding: utf-8 

Encore une fois ... aucune idée quand ou pourquoi. Encore faut-il apprendre comment ça marche en 1.9. J'ai trouvé quelques informations supplémentaires ici: "Ruby 1.9 Common Problems Pt. 1: Encoding".

+0

Est-ce que l'ajout de cette ligne commentée fonctionne vraiment? Est-ce que le compilateur l'analyse réellement? –

+0

J'ai ajouté un lien vers un article de blog à ce sujet. Alors oui, il semble que le compilateur comprend cela. Je ne sais pas si cela va résoudre votre problème. – Cimm