2017-09-18 4 views
1

私はいくつかのデータのためにウェブページを掻き集めようとしています。私はリクエストを投稿して正しいデータを得ました。問題は、私のようなものを得ることです:Request NodeJSから本文への正しいエンコーディング

"KannstデュbitteのNOCHのeinmalを... erzýhlen、ウィー・デュwýhrendデア・サファリeinenLýwenverjagt HAST?"

は通常 erzählen - währendは、Ä、Öので、ß、Üが正しく表示されません。ここ

は私のコードです:

var querystring = require('querystring'); 
var iconv = require('iconv-lite') 
var request = require('request'); 
var fs = require('fs'); 
var writer = fs.createWriteStream('outputBodyutf8String.html'); 


var form = { 
    id:'2974', 
    opt1:'', 
    opt2:'30', 
    ref:'A1', 
    tid:'157', 
    tid2:'', 
    fnum:'2' 
}; 

var formData = querystring.stringify(form); 
var contentLength = formData.length; 

request({ 
    headers: { 
     'Content-Length': contentLength, 
     'Content-Type': 'application/x-www-form-urlencoded' 
    }, 
    uri: 'xxxxxx.php', 
    body: formData, 
    method: 'POST' 
}, function (err, res, body) { 
    var utf8String = iconv.decode(body,"ISO-8859-1"); 
    console.log(utf8String); 
    writer.write(utf8String); 
}); 

正しい文字でHTML本体の中に取得する方法?

答えて

1

回答の正しいエンコーディングはどのようにして調べられますか?

私はあなたがこすりしようとしているウェブサイトに行って、この見つかった:ここ

enter image description here

し、別の文字エンコーディング宣言:このウェブサイト

enter image description here

を異なる2が定義されましたチャーターエンコーディング! 私はどちらを使用しますか?

これはあなたには当てはまりません。 ローカルマシンからHTMLファイルを読み込む場合、メタタグで定義されているcharsetまたはcontent-typeがエンコードに使用されます。

HTTP経由でこのドキュメントを取得するので、ファイルは応答ヘッダーに従ってエンコードされます。

ここには、ウェブサイトを訪問した後に受け取った返信ヘッダがあります。

enter image description here

あなたが見ることができるように、彼らは、定義された文字セットを持っていません。それはContent-Typeプロパティに配置する必要があります。このように:彼らは、応答ヘッダ内の任意の指示charsetを持っていないので

enter image description here

、次いで、このpostによれば、meta宣言を使用する必要があります。

しかし、を待って、metacharsetの宣言が2つありました。

コンパイラは上から下にファイルを読み込むため、charsetと宣言された2番目のファイルを使用する必要があります。

結論:彼らはUTF-8

を使用する。また、私はあなたが変換を必要とは思いません。私は間違っているかもしれませんが、あなたはただその回答にアクセスできるはずです。

request({ 
    headers: { 
     'Content-Length': contentLength, 
     'Content-Type': 'application/x-www-form-urlencoded' 
    }, 
    uri: 'xxxxxx.php', 
    body: formData, 
    method: 'POST' 
}, function (err, res, body) { 
    console.log(body); 
    writer.write(body); 
}); 

編集私はエラーが彼らの側にあるとは思いません。私はそれがあなたの側にあると信じています。これを試してみる:

はライターを削除します。

var writer = fs.createWriteStream('outputBodyutf8String.html'); 

そしてrequestコールバックでは、これですべてのものを置き換える:

function (err, res, body) { 
    console.log(body); 
    fs.writeFile('outputBodyutf8String.html', body, 'utf8', function(error) { 
     if(error) 
      console.log('Error Occured', error); 
    ); 
} 

すべてのコードは次のようになります。

var querystring = require('querystring'); 
var iconv = require('iconv-lite') 
var request = require('request'); 
var fs = require('fs'); 

var form = { 
    id:'2974', 
    opt1:'', 
    opt2:'30', 
    ref:'A1', 
    tid:'157', 
    tid2:'', 
    fnum:'2' 
}; 

var formData = querystring.stringify(form); 
var contentLength = formData.length; 

request({ 
    headers: { 
     'Content-Length': contentLength, 
     'Content-Type': 'application/x-www-form-urlencoded' 
    }, 
    uri: 'xxxxxxx.php', 
    body: formData, 
    method: 'POST' 
}, function (err, res, body) { 
    console.log(body); 
    fs.writeFile('outputBodyutf8String.html', body, 'utf8', function(error) { 
     if(error) 
      console.log('Error Occured', error); 
    ); 
} 
+0

ありがとうございます!私はそれを試して、それは動作しませんでした、私はまた、 "Windows - 1250"、 "ISO - 8859 - 15"のような他のエンコードを試しても何もしていない。私は郵便配達で同じPOSTリクエストを試しました。私は正しい結果を得ています。 –

+0

@anoumaru私の更新された答えがあなたを助けるかもしれません。 –

+0

私は後でそれを試してみてください!しかしこれは最高の答えの一つです、ありがとうございました! –

関連する問題