Ruby to_yaml utf8字符串

时间:2009-07-21 09:04:29

标签: ruby utf-8 yaml to-yaml

如何使用ruby to_yaml方法存储带有原始符号但不是转义序列的utf8字符串?

4 个答案:

答案 0 :(得分: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字符串。

答案 1 :(得分: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?"

答案 2 :(得分:3)

RubyForge结帐Ya2Yaml。

答案 3 :(得分:2)

对于Ruby 1.9.3+,这不是问题:默认的YAML引擎是Psych,它默认支持UTF-8。

对于Ruby 1.9.2-您需要在需要yaml 之前安装psych gem并要求

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设置为Evgeny建议(假设您已安装psych gem):

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"