代码之家  ›  专栏  ›  技术社区  ›  Bogdan Gusiev

ruby to_yaml utf8字符串

  •  3
  • Bogdan Gusiev  · 技术社区  · 16 年前

    如何使ruby-to-yaml方法用原始符号而不是转义序列存储utf8字符串?

    4 回复  |  直到 13 年前
        1
  •  3
  •   tadman    16 年前

    这可能是一个非常糟糕的主意,因为我相信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
  •  7
  •   Evgenii    13 年前
    require 'yaml'
    YAML::ENGINE.yamler='psych'
    'Résumé'.to_yaml # => "--- Résumé\n...\n"
    

    红宝石船有两个引擎:赛克和普希克。Syck是旧的,没有维护,但是它在1.9.2中是默认的,所以需要切换到psych。psych以utf-8格式转储utf-8字符串。

        3
  •  3
  •   user128672    16 年前
        4
  •  2
  •   Phrogz    13 年前

    对于Ruby1.9.3+,这不是问题:默认的yaml引擎是psych,它默认支持utf-8。

    psych 宝石和需要它

    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 心理

    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"