2013-10-31 9 views
2

我正在處理ruby sidekiq進程調用第三方並將數據分析到數據庫的應用程序。postgres在sidekiq應用程序編碼錯誤

我使用續集廣告我的orm。

我收到一些奇怪的字符回到結果,例如:

"Tweets en Ingl\xE9s y en Espa\xF1ol"

當這個被試圖保存到Postgres的,下面的錯誤發生:

Sequel::DatabaseError: PG::CharacterNotInRepertoire: ERROR: invalid byte sequence for encoding "UTF8": 0xe9 0x73 0x20

奇怪的是該字符串認爲它是UTF-8,如果我檢查編碼名稱,它說:

name.encoding.name #UTF-8 

我能做些什麼來確保數據的格式適合postgres?

回答

5

僅僅因爲字符串聲稱是UTF-8並不意味着它是UTF-8。 \xe9é in ISO-8859-1(又名Latin-1),但在UTF-8中無效;類似地,\xf1在ISO-8859-1中爲ñ,但在UTF-8中無效。這表明該字符串實際上是用ISO-8859-1而不是UTF-8編碼的。你可以用force_encoding組合修正,以修正關於當前編碼Ruby的混亂和encode以重新編碼爲UTF-8:

> "Tweets en Ingl\xE9s y en Espa\xF1ol".force_encoding('iso-8859-1').encode('utf-8') 
=> "Tweets en Inglés y en Español" 

所以發送該字符串到數據庫之前,你想:

name = name.force_encoding('iso-8859-1').encode('utf-8') 

不幸的是,沒有辦法可靠地檢測字符串的真實編碼。各種編碼重疊,無法判斷è(ISO-8859-1中的\xe8)或č\xe8,ISO-8859-2)是否是沒有手動完整性檢查的正確字符。