将Ruby从1.8.7升级到1.9.3后出现Yaml编码问题

时间:2012-04-23 10:09:01

标签: ruby character-encoding yaml upgrade ruby-1.9.3

也许你可以帮助我进行Yaml编码。

我们有一个应用程序将一些序列化的设置存储为Yaml字符串,例如:

---
quantity_units: Stunden,Tage, Monate, Pauschal, Jahre, GB, MB, Stück, Seite, SMS
categories: Shirts
number_schema: P-[Y4]-[CY3]

我们正处于从Ruby 1.8.7迁移到Ruby 1.9.3的过程中,Yaml解析库在版本之间发生了变化,从Stück到{{1}为我们留下了这样的解码字符串}。

我只想知道如何将这些字符串正确转换为unicode,我会处理其余的事情。

我不知道在1.8.7 Yaml解析器中使用了哪种编码。

2 个答案:

答案 0 :(得分:4)

这看起来像utf8读取为iso-8895-1,并被解释为utf-8 红宝石适配器。您可能想要检查当前的区域设置和 数据库服务器的区域设置。另请参阅访问该文件时会发生什么 数据直接通过控制台,并检查那里的编码。它 看起来像数据库上的utf-8,但被解释为iso-8859-1 介于两者之间。

如果没有任何帮助,那么会有一个片段来传递您的数据(和 把它写回去。)

 "Stück".encode('iso-8859-1').force_encoding('utf-8') # I've no idea what I'm doing.
 # => "Stück"

答案 1 :(得分:-1)

谢谢@Tass,我写了一个奇怪的方法,比如你的“#我不知道我在做什么。”

我在ruby 1.8下的rails 2.3中有一个应用程序,它与rails 3.2和ruby 1.9共享一个Mysql数据库

在轨道上2.2 当我保存序列化数组时,有时我可以在mysql中看到“二进制!”或者我的字符串格式错误,因此,当我用rails 3.2显示文本时,我的行为很奇怪。

我写了一个方法来处理这个问题(我希望我们将迁移rails 2.3):

def self.decode(words)
  temp_name = words || ''
  temp_name_encoding = temp_name.encoding

  if temp_name_encoding == Encoding::ASCII_8BIT
    return temp_name.encode('ASCII-8BIT').force_encoding('utf-8')
  elsif temp_name_encoding == Encoding::UTF_8
    return temp_name.encode('iso-8859-1').force_encoding('utf-8')
  else
    return temp_name
  end
rescue Encoding::UndefinedConversionError
  temp_name
end