加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

红宝石 – Thor&YAML输出为二进制

发布时间:2020-12-16 19:45:53 所属栏目:百科 来源:网络整理
导读:我正在使用Thor并尝试将YAML输出到一个文件.在irb我得到我的期望YAML格式的纯文本.但是当Thor的一部分方法,其输出是不同的… class Foo Thor include Thor::Actions desc "bar","test" def set test = {"name" = "Xavier","age" = 30} puts test # {"name"="
我正在使用Thor并尝试将YAML输出到一个文件.在irb我得到我的期望YAML格式的纯文本.但是当Thor的一部分方法,其输出是不同的…
class Foo < Thor
  include Thor::Actions

  desc "bar","test"
  def set
    test = {"name" => "Xavier","age" => 30}
    puts test
    # {"name"=>"Xavier","age"=>30}
    puts test.to_yaml
    # !binary "bmFtZQ==": !binary |-
    #   WGF2aWVy
    # !binary "YWdl": 30
    File.open("data/config.yml","w") {|f| f.write(test.to_yaml) }
  end
end

有任何想法吗?

解决方法

所有Ruby 1.9字符串都附有一个编码.

YAML将一些非UTF8字符串编码为二进制,即使它们看起来无辜,也没有任何高位字符.您可能会认为您的代码始终使用UTF8,但内置函数可以返回非UTF8字符串(ex文件路径例程).

为了避免二进制编码,请确保在调用to_yaml之前,所有的字符串编码都是UTF-8.使用force_encoding(“UTF-8”)方法更改编码.

例如,这是我如何将我的选项哈希编码为yaml:

options = {
    :port => 26000,:rackup => File.expand_path(File.join(File.dirname(__FILE__),"../sveg.rb"))
}
utf8_options = {}
options.each_pair { |k,v| utf8_options[k] = ((v.is_a? String) ? v.force_encoding("UTF-8") : v)}
puts utf8_options.to_yaml

这是一个将二进制的简单字符串编码为yaml的例子

>> x = "test"
=> "test"
>> x.encoding
=> #<Encoding:UTF-8>
>> x.to_yaml
=> "--- testn...n"
>> x.force_encoding "ASCII-8BIT"
=> "test"
>> x.to_yaml
=> "--- !binary |-n  dGVzdA==n"

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读