L O S T :( Скопировал некоторые данные с Ruby YAML, не могу прочитать их - PullRequest
0 голосов
/ 11 ноября 2010

поэтому я сохранил на диск некоторые объекты, используя следующий код (это Ruby 1.9.2 в Windows BTW):

open('1.txt', "wb") { |file|
    file.write(YAML::dump( results))
}

Теперь я пытаюсь вернуть эти данные, но получаю «недопустимую последовательность байтов в UTF-8 (ArgumentError)». Я перепробовал все, что мог придумать, чтобы сохранить данные в другом формате, но не повезло. Например

open('1.txt', 'rb'){|f| a1 = YAML::load(f.read)}
a1.each do |a|
    JSON.generate(a)
end

Результат:

 C:/m/ruby-1.9.2-p0-i386-mingw32/lib/ruby/1.9.1/json/common.rb:212:in `match':
invalid byte  sequence 
in UTF-8 (ArgumentError)
    from C:/m/ruby-1.9.2-p0-i386-mingw32/lib/ruby/1.9.1/json/common.rb:212:in `generate'
    from C:/m/ruby-1.9.2-p0-i386-mingw32/lib/ruby/1.9.1/json/common.rb:212:in `generate'
    from merge3.rb:31:in `block in <main>'
    from merge3.rb:29:in `each'
    from merge3.rb:29:in `<main>'

Что я могу сделать?

РЕДАКТИРОВАТЬ: из файла:

--- 
- !ruby/object:Product 
  name: HSF
- !ruby/object:Product
  name: "almer\xA2n"

1-й продукт работает нормально, но 2-й дает исключение.

Ответы [ 3 ]

1 голос
/ 11 ноября 2010

Возможно, ваша кодировка неверна.Вы можете попробовать это:

Encoding.default_external = 'BINARY'

Это должно читаться в файле raw, не интерпретироваться как UTF-8.Вы, вероятно, используете какой-то акцент ISO-8859-1.

0 голосов
/ 11 ноября 2010

Я не уверен, что это то, что вам нужно, но в настоящее время ваш файл YAML выглядит так:

--- 
- !ruby/object:Product 
  name: HSF
- !ruby/object:Product
  name: "almer\xA2n"

Если вы удалите !ruby/object:Product из строк массива, вы получите массив хэшей:

--- 
- name: HSF
- name: "almer\xA2n"

Результат:

YAML::load_file('test.yaml') #=> [{"name"=>"HSF"}, {"name"=>"almer\xA2n"}]

Если я печатаю значение второго элемента, когда мой терминал настроен на наборы символов Windows, я вижу знак цента. Поэтому, если вы пытаетесь восстановить доступ к данным, вам нужно лишь немного манипулировать файлом данных.

0 голосов
/ 11 ноября 2010

Вам необходимо прочитать файл обратно, используя ту же кодировку, которую вы использовали для его записи, очевидно.Поскольку вы не задаете кодировку ни в одном из случаев, в конечном итоге вы получите кодировку, зависящую от среды, вне вашего контроля, поэтому никогда не рекомендуется не указывать кодировку.

отправленный вами фрагмент: явно недопустимый UTF-8, поэтому вполне уместен тот факт, что вы получите исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...