Rails 3,heroku - PGError:错误:编码“UTF8”的无效字节序列:

时间:2011-01-19 22:13:04

标签: ruby-on-rails ruby-on-rails-3

我只是在heroku(postgres)上通过Rails 3随机获得了这个奇怪的错误

PGError: ERROR: invalid byte sequence for encoding "UTF8": 0x85 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding". : INSERT INTO "comments" ("content") VALUES ('BTW∑I re-listened to the video' ......

好的提示并没有为我点击任何东西。我可以在某处设置编码吗?我应该惹这个吗?有人看过这个和/或对如何处理这类问题有任何想法吗?

谢谢

2 个答案:

答案 0 :(得分:6)

从我可以收集的内容来看,这是一个问题,即您尝试插入PostgrSQL服务器的字符串不是用UTF-8编码的。这有点奇怪,因为您的Rails应用程序应配置为默认使用UTF-8。

有几种方法可以尝试修复此问题(按照我推荐的顺序):

  • 首先,确保config.encoding中的"utf-8"设置为config/application.rb

  • 如果您使用的是Ruby 1.9,可以尝试在插入toutf8之前强制使用字符编码。

  • 您可以弄清楚字符串的编码方式,并在插入字符串之前手动设置PostgeSQL连接上的SET CLIENT_ENCODING TO 'ISO-8859-1';(或编码)。不要忘记在重置编码的语句后执行RESET CLIENT_ENCODING;

  • 如果您使用的是Ruby 1.8(更有可能),您可以使用iconv库将字符串转换为UTF-8。请参阅文档here

  • 更狡猾的解决方案是覆盖模型中的getter和setter(即contentcontent=)编码并使用Base64解码您的字符串。它看起来像这样:

require 'base64'

class Comment
  def content
    Base64::decode64(self[:content])
  end

  def content=(value)
    self[:content] = Base64::encode64(value)
  end
end

答案 1 :(得分:0)