谁能接受挑战帮我解决这个最奇怪的错误?昨天花了几个小时都没解决,就像魔法一样。我简直无法相信这是真的,它让我疯了。
顺便说一下,使用:
- Rails 4.2.3
- Ruby 2.2.3
- pg 0.18
Encoding.default_internal = Encoding.default_external = UTF-8
config.encoding = 'utf-8'
这与Postgres、ActiveRecord和编码有关!事实证明,每当我们在数据库中创建带有特殊字符的新用户时,就会出现这些错误:
Encoding::UndefinedConversionError: "\xC3" from ASCII-8BIT to UTF-8
\xC3
可能因字符不同而异。奇怪的是,我们自始至终都将所有内容设置为UTF-8。所以这真的没有道理,我深入挖掘并使用了这个脚本:
User.all.each do
|user| user.attributes.each do
|name, value| if value.is_a? String
puts user.email + name.encoding.to_s + value.encoding.to_s
end
end
end
以下是其中一个用户的输出结果,但所有用户都会得到相同的结果:
dr_lottahelp@blahblah.comUTF-8UTF-8
dr_lottahelp@blahblah.comUTF-8ASCII-8BIT
dr_lottahelp@blahblah.comUTF-8ASCII-8BIT
dr_lottahelp@blahblah.comUTF-8ASCII-8BIT
dr_lottahelp@blahblah.comUTF-8UTF-8
dr_lottahelp@blahblah.comUTF-8UTF-8
dr_lottahelp@blahblah.comUTF-8UTF-8
dr_lottahelp@blahblah.comUTF-8UTF-8
dr_lottahelp@blahblah.comUTF-8UTF-8
dr_lottahelp@blahblah.comUTF-8UTF-8
dr_lottahelp@blahblah.comUTF-8UTF-8
原来,只有3个字段采用了ASCII-8BIT编码。这对我来说完全没有意义!(顺便提一下,这些字段,即
first_name
、middle_name
和last_name
,在数据库中与其他列出的文本字段完全相同,它们不会得到任何特殊处理)。另一个有趣的事情是,如果我不填写这些字段中的任何一个,那么值的编码就是
UTF-8
。但是一旦我填写了它,即使我没有使用特殊字符,它也会被转换为ASCII-8BIT
。有什么建议吗?我已经尝试了每一种方法。
谢谢。