Обход неожиданного поведения в yaml для Ruby - встроенные строки юникода - PullRequest
2 голосов
/ 12 сентября 2010

(1,9 в Windows)

воспроизводящий:

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

И еще раз:

YAML::load(s_interned.to_yaml).class   # => String

Вот как ведет себя «нормальный» символ:

YAML::load(:foo.to_yaml).class         # => Symbol

Нормальные символы ведут себя нормально, но символы с символами Юникода, похоже, не работают. Они интерпретируются как строки с двоеточием в качестве первого символа.

Я почти уверен, что этот скрипт работал прошлой ночью. Но я проснулся этим утром, и все пошло не так.

Кто-нибудь знает, как я могу решить эту проблему или обойти это?

Я пытался использовать некоторые умные хаки с регулярными выражениями, чтобы обойти это и «переконвертировать», но все они оказались не элегантными или усугубили ситуацию.

1 Ответ

0 голосов
/ 12 сентября 2010

Я тоже новичок в 1.9, но кажется, что иногда приходится добавлять кодировку в начало файла. Что-то вроде:

# encoding: utf-8

Опять же ... понятия не имею, когда и почему. Еще нужно узнать, как это работает в 1.9. Я нашел здесь дополнительную справочную информацию: " Ruby 1.9 Распространенные проблемы. Часть 1. Кодировка ".

...