2009-07-21 96 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"