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

时间:2015-09-30 09:38:19

标签: ruby-on-rails ruby postgresql activerecord encoding

最奇怪的错误,是谁应该挑战尝试帮助我?昨天花了几个小时,它就像魔术一样。我无法相信这种情况正在发生,这让我发疯了。

顺便说一句,使用:

  • Rails 4.2.3
  • Ruby 2.2.3
  • 第0.18页
  • Encoding.default_internal = Encoding.default_external = UTF-8
  • config.encoding = 'utf-8'

它与Postgres,ActiveRecord和Encodings有关! 事实证明,每当我们使用特殊字符在数据库上创建新用户时,我们就会收到这些错误:

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编码。这对我来说绝对没有意义!

(btw,first_namemiddle_namelast_name这些字段在数据库中与输出中列出的其他文本字段完全相同,但它们并不相同。得到任何特殊待遇。)

另一个有趣的事情是,如果我没有填写任何字段,则值的编码为UTF-8。但是一旦我填写它,即使我不使用特殊字符,它也会转换为ASCII-8BIT

有什么建议吗?我尝试了所有的事情。

谢谢。

1 个答案:

答案 0 :(得分:1)

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

希望我收到一条更好的错误消息,知道它是由于这个原因造成的,希望有一天有同样问题的人会看到这一天!