【问题标题】:Active Record serialized attr losing string encodings (probably YAML issue), workarounds?Active Record 序列化 attr 丢失字符串编码(可能是 YAML 问题),解决方法?
【发布时间】:2011-04-07 12:56:28
【问题描述】:

我在使用 Rails 2.3.8 和 Ruby 1.9.1 时遇到了问题 活动记录中的序列化属性不保留字符串编码。 潜在的问题可能是yaml,但我想知道是否有人有 关于如何处理这个问题的任何好主意。我正在开发的应用程序有 许多序列化字段,其中一些包含深层结构 数组和哈希。取回一个 ASCII-8Bit 字符串(实际上是 UTF-8) 在这些结构的深处,后来破坏了……

也许最好用例子来说明,如果我将 l 保存到一个序列化的 attr 中 一个活动记录模型,我会在从数据库中读取时返回 l2。

>> l => [“英语”,“土耳其语”,“Русский”] >> l.map(&:编码) => [#,#,#] >> l.map(&:valid_encoding?) => [真实,真实,真实] >> l.to_yaml => "--- \n- 英文\n- !binary |\n VMO8cmvDp2U=\n\n- \"\\xD0\\xA0\\xD1\\x83\\xD1\\x81\\xD1\\x81\\xD0\\xBA\\xD0\\xB8\\xD0\\xB9\"\n" >> l2 = YAML.load(l.to_yaml) => ["英文", "T\xC3\xBCrk\xC3\xA7e", "Русский"] >> l2.map(&:编码) => [#,#,#]

有谁知道 yaml 如何决定是否将字符串存储为 二进制与作为转义字符串?上面的最后两个字符串都是 非 ascii-7 但只有第一个存储为二进制...

我目前的想法是挂钩活动记录反序列化例程,遍历哈希和数组并强制对所有字符串元素进行编码。不是非常安全或一般,但可能适用于我的用例,但我也想知道是否有人修补了 YAML 以便在这里更聪明......

【问题讨论】:

    标签: ruby-on-rails ruby activerecord yaml


    【解决方案1】:

    我确实想出了一个解决方案:

    monkey patching String 可以强制 YAML 使用 \ 转义而不是二进制,因此返回默认编码的字符串(对我来说是 UTF-8)而不是 ASCII-8BIT

    类字符串 def is_binary_data? encoding == Encoding::ASCII_8BIT 除非为空? 结尾 结尾

    最初,这个例程使用一些启发式方法,这些启发式方法会更短 \ 转义字符串的二进制编码,这就是为什么我只有一些国际字符串有问题。

    【讨论】:

      猜你喜欢
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2011-09-22
      • 2015-04-22
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多