2011-01-19 124 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

相關問題