【问题标题】:Ruby on Rails, ActiveRecord, Postgres, UTF-8 and ASCII-8BIT encodingsRuby on Rails、ActiveRecord、Postgres、UTF-8 和 ASCII-8BIT 编码
【发布时间】:2015-09-30 09:38:19
【问题描述】:

最奇怪的错误,谁愿意挑战来帮助我?昨天花了几个小时在上面,这就像魔术一样。我不敢相信这会发生,这让我发疯。

顺便说一句,使用:

  • Rails 4.2.3
  • Ruby 2.2.3
  • 第 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

有什么建议吗?我已经尝试了每一件事。

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 这里有一个非常相似的问题。您如何“明确告诉 gem 使用 UTF-8 进行编码”?我仍然没有找到问题的根源......
    • 我就是那个人......我正在解决这个问题,并在这里偶然发现了你的帖子。感谢分享!
    猜你喜欢
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 2011-05-10
    • 2012-07-12
    • 2011-08-23
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多