2011-09-14 41 views
1

我有一個Rails 3.0.9應用程序在我的開發環境中本地運行,並遠程在一個heroku應用程序。我有a method that imports a CSV file into a model,這個文件可以包含非英文字符,比如°,á,é,í等(用西班牙文)。Rails 3,Heroku:Taps服務器錯誤:PGError:錯誤:無效的字節序列編碼「UTF8」:0xba

我目前能夠在我的本地開發(SQLite)數據庫沒有任何問題導入完整的文件(75k記錄);但是,隨着heroku db:push上傳分貝Heroku的時候失敗,我張貼在標題錯誤:

!!! Caught Server Exception 

HTTP CODE: 500 
Taps Server Error: PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xba 
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". 

顯然,Heroku的具有插入「度」字的問題。 (目前該文件沒有任何A,E,I,等人物,但我懷疑這可能會失敗過。)

我在application.rb文件的默認編碼已設置,如下所示:

#.../application.rb 
config.encoding = "utf-8" 

我還能做些什麼來設置'客戶端編碼'並解決這個問題?

回答

4

numero sign,º,在ISO-8869-1中是0xBA而不是UTF-8。因此,您的CSV文件使用Latin-1進行編碼,但您嘗試將它作爲UTF-8存儲在數據庫中,而無需修改編碼。

您可以嘗試告訴您的CSV庫,它正在處理Latin-1編碼的文本,也許它會照顧轉換爲UTF-8。如果不工作,那麼你就可以自己用Iconv做到這一點:

ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xba") 
=> ["º"] 
ruby-1.9.2 > Iconv.iconv('UTF-8', 'ISO-8859-1', "\xb0") 
=> ["°"] 

你不必使用SQLite麻煩,因爲SQLite的往往是非常寬容的,它有一個非常鬆散型的系統。 PostgreSQL,OTOH,往往是相當嚴格,並適當抱怨,如果你試圖餵它無效的數據。如果你打算部署到Heroku和PostgreSQL,我建議你停止在SQLite上開發,還有其他的區別會導致問題(例如GROUP BY和LIKE的行爲)。

+0

感謝您的詳細解釋。我會按照你的建議直接在PostreSQL上開發,因爲這不是我第一次遇到這種性質的問題。 你不建議使用Iconv的用法。我如何將它應用於導入方法?或者是我應該用Iconv清理CSV文件? (假設我無法直接獲取UTF-8中的文本) – bruno077

+0

@ bruno077:你可以通過整個SQLite數據庫來修改編碼('fixed = Iconv.iconv(....,sqlite_string);'然後寫'fixed'回到數據庫中),然後在SQLite本地編碼完成後從SQLite上載。最終所有的東西都是UTF-8,直到那時我們纔會受苦(但情況肯定比十年前好)。 –

+0

非常感謝您的幫助。我會標記你的答案! – bruno077

相關問題