Ruby on Rails,ActiveRecord,Postgres,UTF-8和ASCII-8BIT编码。

3

谁能接受挑战帮我解决这个最奇怪的错误?昨天花了几个小时都没解决,就像魔法一样。我简直无法相信这是真的,它让我疯了。

顺便说一下,使用:

  • 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_namemiddle_namelast_name,在数据库中与其他列出的文本字段完全相同,它们不会得到任何特殊处理)。
另一个有趣的事情是,如果我不填写这些字段中的任何一个,那么值的编码就是UTF-8。但是一旦我填写了它,即使我没有使用特殊字符,它也会被转换为ASCII-8BIT
有什么建议吗?我已经尝试了每一种方法。
谢谢。
1个回答

1

好的,那么在我的情况下,这与宝石crypt_keeper有关。 如果您使用特殊的Unicode字符,例如´,则必须明确告诉宝石使用UTF-8进行编码,否则它将把值存储在数据库中作为ASCII-8BIT。

希望我能得到更好的错误消息来知道是因为这个原因引起的,希望有同样问题的人能在某一天看到这个!


这里有一个非常相似的问题。你如何“明确告诉宝石使用UTF-8进行编码”?尽管如此,我仍然没有找到问题的根源... - Martin Sojka
1
我就是那个人…… 我一直在解决这个问题,偶然发现了你在这里发布的帖子。谢谢你的分享! - Mark Hoffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接