ASCII-8BIT 中的 Rails 编码

Posted

技术标签:

【中文标题】ASCII-8BIT 中的 Rails 编码【英文标题】:Rails encoding in ASCII-8BIT 【发布时间】: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 错误)。你能解决你的问题吗?您找到在测试中复制它的方法了吗? 【参考方案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 ,以及该字符串的确切来源。

【讨论】:

以上是关于ASCII-8BIT 中的 Rails 编码的主要内容,如果未能解决你的问题,请参考以下文章

mysql2 gem 0.3.15 提供编码设置为“utf8”的 ASCII-8BIT

Ruby on Rails - Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8

为啥我会收到从 ASCII-8BIT 到 UTF-8 的字符串编码问题“\xE2”?

将非 ASCII 字符从 ASCII-8BIT 转换为 UTF-8

Amazon Code Deploy 中从 ASCII-8BIT 到 UTF-8 的“\xCB”

ruby `encode': "\xC3" 从 ASCII-8BIT 到 UTF-8 (Encoding::UndefinedConversionError)