【发布时间】:2009-07-21 09:04:28
【问题描述】:
如何制作 ruby to_yaml 方法来存储带有原始符号但不包含转义序列的 utf8 字符串?
【问题讨论】:
如何制作 ruby to_yaml 方法来存储带有原始符号但不包含转义序列的 utf8 字符串?
【问题讨论】:
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。
【讨论】:
no such file to load -- psych)。
psych gem。
这可能是一个非常糟糕的主意,因为我确信 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?"
【讨论】:
通过RubyForge 结帐 Ya2Yaml。
【讨论】:
对于 Ruby 1.9.3+,这不是问题:默认的 YAML 引擎是 Psych,默认支持 UTF-8。
对于 Ruby 1.9.2 - 您需要安装 psych gem 并在需要 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"
或者,按照 Evgeny 的建议设置 yamler(假设您已安装 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"
【讨论】: