2009-07-21 123 views

回答

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确实很麻烦。转储有时会返回一个二进制类型:YAML.unescape(YAML.dump(“sú”)) - > ---!binary | – tokland 2011-03-11 13:31:17

+1

c8O6 – tokland 2011-03-16 11:01:39

3

结帐Ya2Yaml在RubyForge

+1

你可以在这里找到一个更新的版本w/gemspec:https://github.com/afunai/ya2yaml – makevoid 2011-01-06 04:36:32

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

Ruby带有两个YAML引擎:syck和psych。 Syck是旧的,并没有被维护,但它在1.9.2是默认的,所以需要切换到psych。 Psych在UTF-8中转储UTF-8字符串。

2

对于红宝石1.9.3+,这不是一个问题:默认YAML发动机是精极度紧张,默认支持UTF-8。

为Ruby 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"