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)