【问题标题】:Ruby to_yaml utf8 stringRuby to_yaml utf8 字符串
【发布时间】:2009-07-21 09:04:28
【问题描述】:

如何制作 ruby​​ to_yaml 方法来存储带有原始符号但不包含转义序列的 utf8 字符串?

【问题讨论】:

    标签: ruby utf-8 yaml to-yaml


    【解决方案1】:
    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。

    【讨论】:

    • 请注意,此答案仅适用于 Ruby 1.9.3(其中 Psych 已经是默认设置)。上述代码不适用于 Ruby 1.9.2 (no such file to load -- psych)。
    • ...除非您先安装 psych gem。
    【解决方案2】:

    这可能是一个非常糟糕的主意,因为我确信 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?"
    

    【讨论】:

    • 过去默认使用 ASCII 编码是合理的,但现在不是这样了。手册说:“YAML 流使用一组可打印的 Unicode 字符进行编码,无论是 UTF-8 还是 UTF-16。”。所以我认为这只是 Ruby 库中的一个限制,to_yaml 默认应该返回 UTF-8。否则用编辑器修改那些 YAML 真的很麻烦。
    • dump 有时会返回二进制类型: YAML.unescape(YAML.dump("sú")) -> --- !binary | c8O6
    【解决方案3】:

    通过RubyForge 结帐 Ya2Yaml。

    【讨论】:

    【解决方案4】:

    对于 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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 2016-07-03
      • 1970-01-01
      • 2014-01-29
      • 2019-04-05
      相关资源
      最近更新 更多