2012-01-18 7 views
7

私はRSSフィードフェッチャーを書こうとしており、いくつかの文字セットの問題を抱えています。http.getとISO-8859-1でエンコードされたレスポンス

フィードの読み込みと解析は、エンコードに比べて非常に簡単でした。 私はhttp.getでフィードをロードしています。すべてのデータイベントにチャンクをまとめています。 後で、与えられた文字列でうまく動作するnpm-lib feedparserで文字列全体を解析しています。

悲しいことに、私はPHPでutf8_encode()のような機能に慣れていて、node.jsにそれらを忘れてしまっているので、現在私が望んでいないIconvを使用しています。 ?エンコードせずに

は、間違った文字セット用-iconsいくつかのutf8があるのiconvで、文字列が間違って解析されます:/

は現在、私はseperatedlyすべての文字列をコードしています:

//var encoding ≈ ISO-8859-1 etc. (Is the right one, checked with docs etc.) 
// Shortend version 

var iconv = new Iconv(encoding, 'UTF-8'); 

parser.on('article', function(article){ 
    var object = { 
     title : iconv.convert(article.title).toString('UTF-8'), 
     description : iconv.convert(article.summary).toString('UTF-8') 
    } 
    Articles.push(object); 
}); 

は、私が開始すべきデータバッファーでエンコーディングするか、後で完全な文字列でエンコーディングしますか?

ありがとうございました!

PS:エンコーディングは、どのように簡単にNode.jsの中でエンコードを行いモジュールについては、XML

の頭を解析して決定されますか?

+0

は、あなたが働いていないとは何ですか? – loganfsmyth

+0

私はiconvエンコーディングを正しく取得できません – moe

+0

記事オブジェクトは正しくエンコードされず、代わりにガーベッジが含まれていますか?そして、あなたは飼料を見せることができますか? – fent

答えて

9

https://groups.google.com/group/nodejs/browse_thread/thread/b2603afa31aada9cに記載されている同じ問題が発生している可能性があります。

解決策は、Iconvでバッファを処理する前に応答コードをバイナリに設定するように思われます。

関連ビットは

セットresponse.setEncoding( 'バイナリ')であり、()Iconv.convertを呼び出す前にバッファにチャンクを集約。 encoding = binaryは、データコールバックが文字列ではなくBufferオブジェクトを受け取ることを意味します。

を更新しました

これは

私の最初の反応だったが、あなたが受けているフィードが正しくエンコードされていることを確認していますか?

は、私は2つの可能性のあるエラーを確認できます。

  1. フィードをラテン1符号化データとともに送信されているが、しかしcharset=UTF-8を述べContent-Typeを有します。
  2. フィードがUTF-8エンコードされたデータで送信されていますが、Content-Typeヘッダーには何も記載されていません。デフォルトはASCIIです。

WiresharkやcURLのようなユーティリティを使用して、フィードと送信されたヘッダーの内容を確認する必要があります。

+0

ソースはhttpとなっています://www.spiegel.de/schlagzeilen/tops/index.rss –

+0

私はそのコンテンツがISO-8859-1でエンコードされていると確信しています。 Content-HeaderとXMLファイルのヘッダーが一致します。 – moe

+0

確かに正しくエンコードされているようです。私は別の解決策を提案するために私の答えを更新しました。 – gioele

1

フィードパーザにデータを渡す前にデータを格納している可能性があります。あなたのデータイベントハンドラを見ずに言うのは難しいですが、私はあなたがこのような何かやっていることを推測するつもりだ:

values = ''; 
stream.on('data', function(chunk){ 
    values += chunk; 
}); 

すると、その右か?

この場合、チャンクはバッファであり、 '+'を使用してすべてを一緒に追加することで、暗黙的にバッファを文字列に変換します。

feedparserは他のエンコーディングを認識していない可能性が高いので、さらにフィードを見る前に、フィード全体でiconv変換を実行する必要があります。

はこのような何かを試してみてください:

var iconv = new Iconv('ISO-8859-1', 'UTF8'); 
var chunks = []; 
var totallength = 0; 
stream.on('data', function(chunk) { 
    chunks.push(chunk); 
    totallength += chunk.length; 
}); 
stream.on('end', function() { 
    var results = new Buffer(totallength); 
    var pos = 0; 
    for (var i = 0; i < chunks.length; i++) { 
    chunks[i].copy(results, pos); 
    pos += chunks[i].length; 
    } 
    var converted = iconv.convert(results); 
    parser.parseString(converted.toString('utf8')); 
}); 
関連する問題