【问题标题】:Rails encoding in ASCII-8BITASCII-8BIT 中的 Rails 编码
【发布时间】:2014-04-10 12:43:28
【问题描述】:

我知道这已经被问过好几次了,但对我来说发生了一些奇怪的事情:

我有一个索引视图,其中呈现某些字符(带重音的字母)会导致 Rails 引发异常

incompatible character encodings: ASCII-8BIT and UTF-8

所以我检查了我的字符串编码,这实际上是 ASCII-8BIT,即使我在 application.rb 中将正确的编码设置为 UTF-8

config.encoding = "utf-8"

在我的环境中.rb

Encoding.default_external = Encoding::UTF_8
Encoding.default_internal = Encoding::UTF_8

它出现在我的数据库中:

character_set_database = utf-8

在一些指南中建议。

字符串使用 textarea 字段插入,并且不会连接到任何其他已插入的字符串。

奇怪的是:

  • 这仅发生在索引视图中,而这不会发生在节目中(相同的资源)
  • 仅此模型会发生这种情况(这是一封电子邮件,带有主题和正文,但这不会影响任何内容)
  • 在我的开发环境中,设置str.force_encoding('utf-8') 一切顺利,而在我的生产环境中,这不起作用。 (开发我使用 Ruby 2.0.0,生产 Ruby 2.1.0,Rails4 和 MySql)
  • 使用# encoding utf-8 设置文件视图也不起作用
  • 尝试str.force_encoding('ascii-8bit').encode('utf-8')Encoding::UndefinedConversionError "\xC3" from ASCII-8BIT to UTF-8 这是一个à,而使用body.force_encoding('ascii-8bit').encode('UTF-8', :invalid => :replace, :undef => :replace, :replace => '?') 时,将所有重音字符替换为一个?,而str.force_encoding('iso-8859-1').encode('utf-8') 显然会生成错误的字符(@987654335 @)。

所以我的问题是 2: - 为什么rails 将字符串编码设置为ascii-8bit? - 如何解决这个问题?

我已经检查了这些问题(rails4 的最新问题):

Rails View Encoding Issues

"\xC2" to UTF-8 in conversion from ASCII-8BIT to UTF-8

How to convert a string to UTF8 in Ruby

Encoding::UndefinedConversionError: "\xE4" from ASCII-8BIT to UTF-8

还有其他资源,但没有任何效果。

【问题讨论】:

  • 您是否使用文本编辑器将重音字符输入到视图中?
  • 这是一个 textarea_field
  • 源代码文件是 utf-8 还是你的文本编辑器将文件保存在 ascii-8bit 中。
  • 这些不是我的文本编辑器生成的字符串...无论如何文件都是 UTF-8
  • 我正在努力解决类似的问题(从用户输入的数据中获取incompatible character encodings: ASCII-8BIT and UTF-8 错误)。你能解决你的问题吗?您找到在测试中复制它的方法了吗?

标签: ruby-on-rails encoding utf-8 ruby-on-rails-4 ruby-2.1


【解决方案1】:

您的源代码中可能有一个字符串文字,然后您也可以连接另一个字符串。例如:

some_string = "this is a string"

甚至

some_string = "" #empty string

那些存储在some_string 中的字符串将被标记为 ASCII_8BIT,如果您稍后执行以下操作:

some_string = some_string + unicode_string

然后你会得到错误。也就是说,这些字符串将被标记为 ASCII-8BIT 除非您添加到创建字符串文字的文件顶部:

#encoding: utf-8

该声明决定了源代码中的字符串文字将具有的默认编码。

我只是猜测,因为这种模式是这个问题的常见来源。要确定更多信息,它将需要比您的问题更多的信息——它需要调试实际的源代码,以准确地找出当您期望它被标记为 UTF-8 时,哪个字符串被标记为 ASCII-8BIT ,以及该字符串的确切来源。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2011-12-14
    • 1970-01-01
    • 2014-09-29
    • 2020-05-25
    • 2014-08-26
    • 2017-10-02
    相关资源
    最近更新 更多