【问题标题】:Yaml encoding issues after upgrading Ruby to 1.9.3 from 1.8.7将 Ruby 从 1.8.7 升级到 1.9.3 后的 Yaml 编码问题
【发布时间】:2012-05-03 22:42:27
【问题描述】:

也许你可以帮助我使用 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ückStück

我只想知道如何将这些字符串正确地转换为 unicode,剩下的我来处理。

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

【问题讨论】:

  • 您使用哪种编码来读取 YAML 文件? ruby 中的Stück 字符串有哪些编码?
  • 默认 UTF-8 ruby​​ 1.9.3 编码; > "Stück".encoding # => #<Encoding:UTF-8>

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


【解决方案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

【讨论】:

    【解决方案2】:

    这看起来像 utf8 读取为 iso-8895-1,并被解释为 utf-8 红宝石适配器。您可能需要检查您当前的语言环境和 数据库服务器的语言环境。也看看如果你访问会发生什么 直接通过控制台获取数据,并在那里检查编码。它 在数据库中看起来像 utf-8,但被解释为 iso-8859-1 介于两者之间。

    如果没有任何帮助,可以通过 sn-p 传递您的数据(并且 写回去)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多