2009-07-21 3 views
3

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

ответ

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?" 
+0

В прошлом было целесообразно использовать кодировку ASCII по умолчанию, но это не так Теперь. И в руководстве говорится: «Потоки YAML кодируются с использованием набора печатных символов Unicode, либо в UTF-8, либо в UTF-16». Поэтому я думаю, что это просто ограничение в библиотеке Ruby, to_yaml должно возвращать UTF-8 по умолчанию. В противном случае очень важно изменить этот YAML с помощью редактора. – tokland

+1

dump иногда возвращает двоичный тип: YAML.unescape (YAML.dump ("sú")) -> ---! Binary | c8O6 – tokland

3

Checkout Ya2Yaml в RubyForge ,

+1

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

7
require 'yaml' 
YAML::ENGINE.yamler='psych' 
'Résumé'.to_yaml # => "--- Résumé\n...\n" 

Рубиновые суда с двумя двигателями YAML: сик и психологи. Syck старен и не поддерживается, но по умолчанию он равен 1.9.2, поэтому нужно переключиться на психику. Психические сбрасывают строки UTF-8 в UTF-8.

+1

Обратите внимание, что этот ответ работает только для Ruby 1.9.3 (где Psych уже по умолчанию). Вышеприведенный код не работает для Ruby 1.9.2 ('no такой файл для загрузки - psych'). – Phrogz

+1

... если вы не впервые установили драгоценность 'psych'. – Phrogz

2

Для Ruby 1.9.3+ это не проблема: по умолчанию YAML-движок - это Psych, который поддерживает UTF-8 по умолчанию.

Для Руби 1.9.2- вам нужно установить psych камень и требуют , прежде чем требовать 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" 
Смежные вопросы