2

也许您可以帮助我使用 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 解析库在版本之间发生了变化,给我们留下了这样的解码字符串 from Stückto Stück

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

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

4

2 回答 2

4

这看起来像 utf8 读取为 iso-8895-1,并被 ruby​​ 适配器解释为 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"
于 2012-04-23T10:24:26.630 回答
-1

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

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

在 Rails 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
于 2013-05-07T15:04:56.230 回答