0

Rails アプリで rss/atom-feeds を解析しようとしていますが、ASCII 以外の文字で重大な問題が発生しました。ドイツ語のウムラウト ÄÖÜ または ß。フィードの中には、適切な UTF-8 を使用しているものもありますが、泣けるものもあります。一般的な問題は次のとおりです。

どのようなエンコーディングであっても、フィードを解析できなければなりません。文字の「損失」はオプションではありません (私の現在の状況ではありますが)。

私がこれまでに使用しているもの:

  • フィードを取得して解析するための FeedZirra は、これまでのところうまく機能しています。また、FeedZirra から取得した値を「サニタイズ」します。
  • "Ä"「Ä」を意味するような特殊文字をエスケープ解除するための HTMLEntities (gem)
  • rCharDet19 gem を使用して、フィードに含まれている可能性のあるエンコーディングを特定し、次のことを行います。
  • 文字列.エンコード! それが何であれ、utf-8に変換する
  • Ubuntu Linux 12.04 上の Ruby 1.9.3 (最新) および Rails 3.2.8

問題は、私が何を間違っているのか文字通りわからないことです。

  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

これまでのところ、「特殊」文字は完全に置き換えられています。これは、無効なバイトが原因でエラーを発生させずに機能する、私が見つけた唯一のバリアントです。エンコーディングが指定されていない場合、エンコード メソッドはアプリの指定された default_internal エンコーディング (私の場合は utf-8) に「変換」する必要があることを ruby​​ doc で読んだため、エンコード メソッドを少し変更しました。CharDet は、関連するすべての変更の可能性を表しており、役立つ可能性があります。

私は magic_encoding gem を使用したので、プロジェクト内のすべてのファイルの最初の行にコメントが必要です。私のデータベースは utf-8 の sqlite3 です。

2012年の時点で、私が見るべきものはありますか? 私は本当に何か間違ったことをしましたか?

手伝ってくれてありがとう!

編集: フィードは、任意の種類の rss、アトム、および/または単に無効な XML である可能性があります。エンコーディングは UTF-8 であったり、別のものであったり、単に "utf-8" と表示されているのに、windows-XXX のものなどであったりします。私は本当にこれをすべて解決する必要があります。

また、取得/解析はできるだけ高速である必要があるため、feedzirra を選択しました。

私の現在のアイデアは、フィードコンテンツを取得し、可能であれば「タイトル」ノードと「説明」ノードのすべての文字をhtmlentitiesに置き換え、エンコードを使用することです! メソッドを使用して utf-8 に切り替えてから、htmlentities をエスケープ解除します。この後、特殊文字を保持する必要があると思いますが、現時点ではこのようなものを動作させることはできません. これは良いアプローチでしょうか?

4

1 に答える 1

0

最後に、主な問題を見つけました:

Feedzirra は、エントリとその属性にアクセスするときに、既に UTF-8 を返します。しかし、属性にアクセスするためにサニタイズ メソッドを使用しました。このメソッドは、HTML エンティティとしてエスケープされた ASCII-8BIT と奇妙な文字を返します。

ただし、コードからすべてのサニタイズとエンコーディングを追い出したので、今では問題なく動作しています。FeedZirra には、必要に応じてフィードをトランスコードする機能が組み込まれているようです。

于 2012-08-30T07:45:14.007 に答える