2012-08-29 46 views
0

我想解析我的rails應用程序中的rss/atom-feeds,但我遇到了一些非ASCII字符的嚴重問題,例如。德國變音符號ÄÖÜ或ß。野外的一些飼料使用正確的UTF-8,但其他一些飼料讓我哭泣。一般問題是:飼料編碼問題Ruby 1.9

我必須能夠解析任何提要,無論他們可能有什麼編碼。字符的「損失」不是一個選項(儘管它是我目前的狀態),因爲我對feed-items做了一些文本和語言分析。

我使用至今:

  • FeedZirra用於獲取和解析飼料,效果很好至今。我也「清理」從FeedZirra獲得的價值。
  • ヶ輛(GEM),用於進行反向轉義特殊字符,如"Ä"這意味着 「A」
  • rCharDet19寶石,找出哪些編碼飼料可能有,並且:
  • string.encode!從不管它是UTF-8
  • 的Ruby 1.9.3(最新的)和Rails 3.2.8在Ubuntu Linux 12.04

的問題是轉換,那我真的不知道我在做什麼錯誤。

def self.sanitize_encoding_and_htmlentities str 
    cd = CharDet.detect str 
    s = str.encode(:invalid => :replace, :undef => :replace, :replace => '') 
    coder = HTMLEntities.new 
    coder.decode(s) 
    end 

這是我目前的衛生方法。作爲樣品進我使用

http://www.N24.de/2/index.rss 

到目前爲止,「特」字得到了徹底更換。這是我發現的唯一變體,它只是在沒有因無效字節的原因而引發錯誤的情況下工作。我稍微改變了編碼方法,因爲我在ruby文件中讀到沒有給出任何編碼,編碼方法應該「翻譯」到應用程序的給定default_internal編碼,在我的例子中是utf-8。 CharDet站在那裏只是爲了可能的改變任何相關的,可能是有用的。

我使用了magic_encoding gem,因此我項目中的每個文件都應該在第一行有註釋。我的數據庫是utf-8的sqlite3。

截至2012年,有什麼我應該看看?我做錯了什麼嗎?

感謝您的幫助!

編輯: 飼料可能是rss的任何種類,原子,和/或只是無效的XML。 Encoding可能是UTF-8,有些不同,或者只是說「utf-8」,而它的一些windows-XXX的東西,等等。我真的需要一個解決方案。

也提取/解析必須儘可能快,這就是爲什麼我選擇feedzirra。

我目前的想法是獲取feedcontent,如果可能的話用htmlentities替換「title」和「description」節點中的每個字符,使用encode!方法切換到utf-8,然後使用這些特性。在此之後,我認爲應該保留特殊字符,但目前我無法得到像這樣的工作。可能這是一個好方法?

回答

0

終於讓我找到的主要問題:

Feedzirra已經返回UTF-8訪問時條目及其屬性。但我使用sanitize方法來訪問屬性,它返回ASCII-8BIT和奇怪的字符作爲html實體轉義。

但是,我踢了所有的消毒和編碼的東西,我的代碼,現在它只是工作。似乎FeedZirra有一些內置的代碼轉換飼料,如果必要的話。