【问题标题】:Ruby: parse yaml from ANSI to UTF-8Ruby:将 yaml 从 ANSI 解析为 UTF-8
【发布时间】:2015-09-23 11:18:39
【问题描述】:

问题:

我有可以用 UTF-8 或 ANSI 编码的 yaml 文件 test.yml

:excel:
  "Test":
    "eins_Ä": :eins
    "zwei_ä": :zwei

当我加载文件时,我需要将其编码为 UTF-8,因此尝试转换所有字符串:

require 'yaml'
file = YAML::load_file('C:/Users/S61256/Desktop/test.yml')

require 'iconv'
CONV = Iconv.new("UTF-8", "ASCII")

class Test

    def convert(hash)
        hash.each{ |key, value| 
            convert(value) if value.is_a? Hash
            CONV.iconv(value) if value.is_a? String
            CONV.iconv(key) if key.is_a? String
        }
    end

end

t = Test.new
converted = t.convert(file)

p file
p converted

但是当我尝试运行这个示例脚本时,它会打印:

in 'iconv': eins_- (Iconv:IllegalSequence)

问题:

1.为什么会出现错误,我该如何解决?

2.是否有另一种(更合适的)方法来获取 UTF-8 格式的文件内容?

注意: 我需要此代码与 Ruby 1.8 和 Ruby 2.2 兼容。对于 Ruby 2.2,我会用 String::encode 替换所有 Iconv 的东西,但这是另一个话题。

【问题讨论】:

    标签: ruby encoding utf-8 yaml


    【解决方案1】:

    处理错误编码文件的最简单方法是以原始编码读取它,转换为 UTF-8,然后传递给接收器(本例中为 YAML):

    ▶ YAML.load File.read('/tmp/q.yml', encoding: 'ISO-8859-1').force_encoding 'UTF-8'
    #⇒ {:excel=>{"Test"=>{"eins_Ä"=>:eins, "zwei_ä"=>:zwei}}}
    

    对于 Ruby 1.8,您可能应该使用 Iconv,但整个过程(按原样读取,而不是编码,而不是 yaml-load)保持不变。

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 2016-05-11
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2014-01-27
      相关资源
      最近更新 更多