【问题标题】:YAML dump inconsistent string encodingYAML 转储不一致的字符串编码
【发布时间】:2019-04-08 01:27:07
【问题描述】:

Ruby 版本:2.2.5 Rails 版本:'~> 4.0.13'

为什么我和我的朋友在尝试使用YAML.dump 方法将字符串转换为 YAML 时收到不同的结果?

[1] pry(main)> YAML.dump("foo")
=> "--- foo\n"
[2] pry(main)> "foo".to_yaml
=> "--- foo\n"

虽然他有:

[1] pry(main)> YAML.dump("foo")
=> "--- foo\n...\n"
[2] pry(main)> "foo".to_yaml
=> "--- foo\n...\n"

换行后有三个点 (...)

更新

我已确认我的 rails 在 rails 控制台中使用 Psych 作为 YAML 解析器引擎:

2.2.5 :002 > YAML
 => Psych
2.2.5 :004 > Psych.dump("foo")
 => "--- foo\n"
2.2.5 :005 > YAML.dump("foo")
 => "--- foo\n"
2.2.5 :006 >

但结果仍然有所不同。有关其他信息,我没有安装任何 syck gem,并且在我的 rails 项目的任何文件中都不需要它。

【问题讨论】:

  • 你知道这是为什么吗?我今天遇到了同样的问题,我不知道为什么。这会导致不同系统之间出现一些问题

标签: ruby-on-rails ruby yaml


【解决方案1】:

看起来“你”可能正在使用 syck 作为 YAML 处理器,而“他”正在使用 psych。例如。

 require 'syck' 
 require 'psych'
 Syck.dump("foo")
 #=> "--- foo\n"
 Psych.dump("foo")
 #=> "--- foo\n...\n"

两者本身都是有效的 YAML 解析器/发射器,尽管 Psych 自 1.9 以来一直是首选,而 Syck 实际上仅作为向后兼容的 gem 存在,并且在 2.0.0 时已从 ruby​​ 标准库中完全删除

至于为什么“你”以某种方式使用 Syck 而不是这篇文章中提供的更多信息,我不能说。

【讨论】:

  • 我在 Rails 控制台中检查了 YAML 对象似乎正在使用Psych。但不知何故,我仍然得到上述结果。
【解决方案2】:

我本周遇到了这个问题,并花了很多时间调查根本原因。我发现系统中libyaml的不同会影响dump。

对于 libyaml 版本 0.1.7,它将始终包含这样的结尾字符,这就是为什么你有额外的“...\n”。

对于 libyaml 0.2.1 及以上版本,它支持隐式结尾,因此可以忽略这些字符

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2018-01-25
    相关资源
    最近更新 更多