【问题标题】:Rails encoding error. HAML issue I thinkRails 编码错误。我认为 HAML 问题
【发布时间】:2012-03-05 18:57:57
【问题描述】:

我正在使用带有 pg 0.13.2 和 haml 3.1.4 的 postgres 在 rails 3.2.1 上。 DB编码是“unicode”,我很确定它与postgres的“UTF-8”相同 元标记具有 charset=utf-8 (在表单页面和显示页面上)并且表单具有 accept-charset="UTF-8"

我在我的生产环境(Heroku cedar)中遇到“不兼容的字符编码:ASCII-8BIT 和 UTF-8”错误,到目前为止我已经尝试了很多修复,但并不真正了解发生了什么.开发环境不会导致问题。

导致问题的字符串有一个从 Word 复制/粘贴的撇号。如果我删除该字符,一切都会呈现正常,但这是用户提交的内容,所以它肯定会在未来再次中断。

从 Heroku 控制台,调用 string.encoding.name 返回“UTF-8”,在视图中使用 force_encoding("UTF-8") 没有区别。

但是,如果我在字符串上使用 haml 过滤器(如 :markdown),则一切都很好。 此外,将视图更改为 erb 可以解决问题。

有什么想法吗?在任何地方都使用过滤器并不可行,我想深入了解一下。

【问题讨论】:

  • 字符在数据库中还是在HAML模板中?

标签: ruby-on-rails ruby ruby-on-rails-3 character-encoding haml


【解决方案1】:

您应该确保从数据库中获取的数据设置为正确的编码。如果您没有在database.yml 文件中指定正确的选项,则数据库编码可能与数据库连接编码不同。例如,您可能需要:

development:
  encoding: utf-8

确保您通过此连接检索的值已正确编码:

my_model.my_attribute.encoding
# => #<Encoding:UTF-8> 

如果您有 BINARY 类型字段,则无论设置如何,您都可能会得到 ASCII-8BIT。您可以尝试强制转换它,也可以尝试修复列类型。强制编码通常是最简单的:

my_model.my_attribute.force_encoding('UTF-8')

请记住,force_encoding 实际上并没有转换,它只是改变了字符串的解释方式。

【讨论】:

  • 我已经完成/检查了您在原始问题状态中提到的所有内容。
  • 那里一定有一个值设置不正确。如果您使用任何 unicode 字符(如 ☃ 或它特定于粘贴的 Word-style ' 字符),是否会发生这种情况?
【解决方案2】:

tl;博士 切换到 rdiscount 解析器,现在一切正常。

加长版: 我仍然不确定发生了什么,但我知道它在解析器中(rpeg-markdown gem)。

生产页面上的另一段文字有一个奇怪的单词撇号,这似乎是问题所在。如果我将两个字符串都包装在 :markdown 过滤器中,则一切正常,但如果其中任何一个不在过滤器中,即使所有内容都是 utf-8,我也会收到编码错误。

我切换到 rdiscount,现在无论一个(或两个)块是否包含在 :markdown 过滤器中,它都可以工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多