2011-01-19 171 views
5

我只是随机通过Rails 3中得到这个奇怪的错误,在Heroku(Postgres的)Rails 3中,Heroku的 - PGError:错误:编码 “UTF8” 无效的字节序列:

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' ...... 

而漂亮的ISN的提示”不要为我点击任何东西。我可以在某处设置编码吗?我应该甚至弄糊涂了吗?任何人看到这个和/或对如何处理这类问题有任何想法?

谢谢

回答

6

据我所知,这就是你想插入到你的PostgrSQL服务器中的字符串不使用UTF-8编码的问题。这有点奇怪,因为您的Rails应用程序应该被配置为默认使用UTF-8。

有几种方法可以尝试解决这个问题(在我的推荐顺序):

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

  • 如果您使用的是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 
+0

谢谢vonconrad,你是一个拯救生命的人。我确实已经正确设置了config.ecoding。虽然Heroku可能会改变部署方式。如果我使用iconv解决方案(这看起来是您评论中最明智的选择),那么在升级到Ruby 1.9时遇到的任何问题?此外,doc对于iconv来说是空的,我是一个新手,有什么方法可以看到一个例子吗?谢谢! – AnApprentice 2011-01-20 03:02:44

相关问题