2012-09-10 108 views
1

我有一些數據已導入到Postgres中,用於Rails應用程序。然而不知何故外國口音已經變得奇怪編碼:奇怪的字符編碼問題

  • ä出現â§
  • á顯示爲â°
  • é顯示爲â©
  • ó顯示爲ââ¥

我很確定問題是與inte數據的可靠性,而不是Rails的任何問題。這似乎並不符合任何編碼我嘗試:

# Replace "cp1252" with any other encoding, to no effect 
"Trollâ§ttan".encode("cp1252").force_encoding("UTF-8") #-> junk 

如果有人能夠識別什麼樣的編碼查詢股價,我患的,那將是巨大的。

作爲最後的手段,我可​​能不得不手動替換每個損壞的重音字符,但如果任何人都可以建議一個編程解決方案(或者甚至是解決此問題的起點 - 我發現它很難調試),我會很感激。

+0

你能檢查數據庫使用什麼編碼嗎?另外,數據是如何導入的? – PinnyM

+0

編碼是'UTF8'(整理'en_US.UTF-8')。數據經歷了一個非常複雜的導入過程(最初是CSV,然後通過Google Refine,然後進行了更多轉換)。重新導入數據並不容易,所以就地修復將是理想的。 –

+0

和原始的CSV文件 - 那是什麼編碼?一個'複雜的導入過程'增加了很多變量,並且它可能會導致編碼的錯誤解釋多於一個......此外,如果您可以在每個過程的時間間隔驗證編碼,這可能有助於鎖定源因爲腐敗問題相當多。 – PinnyM

回答

2

最近的PostgreSQL版本在UTF8數據庫中使用無效的UTF8幾乎是不可能的。儘管如此,還有其他合理的可能性可能導致產出。

é表現爲©的典型情況下,無論是:

  1. 數據庫的內容是有效的,但是一些客戶端層解釋從數據庫中的字節就好像它們是異拉丁文的東西,而他們是UTF8。

  2. 內容有效且SQL客戶端層有效,但您正在查看的終端/軟件/網頁配置爲iso-latin1或類似的單字節編碼(win1252,異latin9 ...)。

  3. 數據庫的內容由具有有效UTF8編碼的錯誤字符組成。如果你使用ISO拉丁字節的字節,將它們轉換爲UTF8表示,然後將結果字節流視爲如果仍在iso-latin中,並再次將其重新轉換爲UTF8,然後插入進入數據庫。

注意的是,雖然©順序UTF8與ISO-LATIN混亂是典型的,在你的所有樣本串附加â的存在是少見。這可能是另一個主要錯誤解釋的結果。如果您遇到#3情況,這可能意味着基於搜索替換的自動修復比正常情況更困難。