Вопрос по utf-8, yaml, ruby, to-yaml – Рубиновая строка to_yaml utf8

3

Как сделать метод ruby to_yaml для хранения строк utf8 с оригинальными знаками, но без escape-последовательности?

Ваш Ответ

4   ответа
3
Вы можете найти обновленную версию с gemspec здесь:github.com/afunai/ya2yaml
3

вероятно, очень плохая идея, так как я уверен, что YAML имеет свои причины для кодирования символов, как это происходит, но это не кажется слишком трудным для отмены:

require 'yaml'
require 'yaml/encoding'

text = "Ça va bien?"

puts text.to_yaml(:Encoding => :Utf8) # => --- "\xC3\x87a va bien?"
puts YAML.unescape(YAML.dump(text)) # => --- "Ça va bien?"
Дамп иногда возвращает двоичный тип: YAML.unescape (YAML.dump (& quot; s & # xFA; & quot;)) - & gt; ---! двоичный | c8O6
В прошлом было разумно использовать кодировку ASCII по умолчанию, но сейчас это не так. И в руководстве говорится: «Потоки YAML кодируются с использованием набора печатаемых символов Unicode, либо в UTF-8, либо в UTF-16». Так что я думаю, что это просто ограничение в библиотеке Ruby, to_yaml должен возвращать UTF-8 по умолчанию. В противном случае действительно обременительно модифицировать эти YAML с помощью редактора.
7
require 'yaml'
YAML::ENGINE.yamler='psych'
'Résumé'.to_yaml # => "--- Résumé\n...\n"

syck и psych. Syck устарел и не поддерживается, но по умолчанию в 1.9.2, поэтому нужно переключиться на psych. Psych сбрасывает строки UTF-8 в UTF-8.

& # x2026; если вы сначала не установитеpsych драгоценный камень.
Обратите внимание, что этот ответ работает только для Ruby 1.9.3 (где Psych уже используется по умолчанию). Приведенный выше код не работает для Ruby 1.9.2 (no such file to load -- psych).
2

механизм YAML по умолчанию - Psych, который по умолчанию поддерживает UTF-8.

Для Ruby 1.9.2 - вам необходимо установитьpsych драгоценный камень и требует егоbefore you require yaml:

irb(main):001:0> require 'yaml'
#=> true
irb(main):002:0> require 'psych'
#=> true
irb(main):003:0> YAML::ENGINE
#=> #<YAML::EngineManager:0x00000001a1f642 @yamler="syck">
irb(main):004:0> "ça va?".to_yaml
#=> "--- \"\\xC3\\xA7a va?\"\n"
irb(main):001:0> require 'psych' # gem install psych
#=> true
irb(main):002:0> require 'yaml'
#=> true
irb(main):003:0> YAML::ENGINE
#=> #<YAML::EngineManager:0x00000001a1f828 @yamler="psych">
irb(main):004:0> "ça va bien!".to_yaml
#=> "--- ça va bien!\n...\n"

В качестве альтернативы, установитеyamler как предлагает Евгений (при условии, что вы установилиpsych драгоценный камень):

irb(main):001:0> require 'yaml'
#=> true
irb(main):002:0> YAML::ENGINE.yamler
#=> "syck"
irb(main):003:0> "ça va?".to_yaml
#=> "--- \"\\xC3\\xA7a va?\"\n"
irb(main):004:0> YAML::ENGINE.yamler = 'psych'
#=> "psych"
irb(main):005:0> "ça va".to_yaml
#=> "--- ça va\n...\n"

Похожие вопросы