2012-03-05 16 views
1

我在rails 3.2.1上使用postgres與pg 0.13.2和haml 3.1.4。 數據庫編碼是「unicode」,我很確定它與postgres的「UTF-8」相同 Meta標籤具有charset = utf-8(在表單頁面和顯示頁面上)並且表單具有accept-charset = 「UTF-8」Rails編碼錯誤。 HAML問題我認爲

我在我的生產環境(Heroku雪松)中收到「不兼容的字符編碼:ASCII-8BIT和UTF-8」錯誤,至今我嘗試了一堆修復程序,我真的明白髮生了什麼事。開發環境不會導致問題。

導致問題的字符串具有從Word複製/粘貼的撇號。如果我刪除角色的所有內容都可以正常呈現,但這是用戶提交的內容,因此未來可能會再次出現此問題。

從Heroku的consol中調用string.encoding.name返回「UTF-8」,在視圖中使用force_encoding(「UTF-8」)沒有區別。

但是,如果我在字符串上使用haml過濾器(如:markdown),它都呈現良好。 另外,將視圖更改爲erb可以修復問題。

任何想法?在任何地方使用過濾器都不太可行,我想深入瞭解這一點。

+0

數據庫中的字符還是在HAML模板中? – tadman 2012-03-05 19:30:08

+0

它在數據庫中。 – kjs3 2012-03-05 21:23:15

回答

0

tl; dr 切換到rdiscount解析器,現在一切正常。

加長版本: 我仍然不確定發生了什麼,但我知道它在解析器(rpeg-markdown gem)中。

生產頁面上的另一個文本有一個奇怪的單詞撇號,這似乎是問題。如果我將兩個字符串包裝在一起:markdown篩選器,它都可以工作,但如果其中一個不在篩選器中,即使所有內容都是utf-8,我也會得到編碼錯誤。

我切換到rdiscount,現在它可以工作,無論是否有一個(或兩個)塊都包含在:markdown過濾器中。

0

您應該確保您從數據庫中獲取的數據是使用正確的編碼設置的。如果您尚未在您的database.yml文件中指定正確的選項,數據庫編碼可能與數據庫連接編碼不同。例如,您可能需要:

development: 
    encoding: utf-8 

確保您通過此連接檢索值被正確編碼:

my_model.my_attribute.encoding 
# => #<Encoding:UTF-8> 

如果你有BINARY類型字段,你可能會得到ASCII-8BIT不管設置。你可以嘗試強制轉換,或者你可以嘗試修復列類型。強制編碼,通常是最簡單的:

my_model.my_attribute.force_encoding('UTF-8') 

記住force_encoding實際上並沒有轉換,它只是改變了字符串被解釋的方式。

+0

我已經完成/檢查了您提到的所有原始問題狀態。 – kjs3 2012-03-05 23:22:50

+0

在那裏設置不正確的地方必須有一個價值。如果使用任何unicode字符(如☃)或是特定於粘貼的Word樣式字符,是否會發生這種情況? – tadman 2012-03-06 15:32:43