3

std.net.curlWebページの削除からHTMLを取得するためのモジュールを使用しています。しかし、エンコーディングに関していくつか問題があり、修正方法がわかりません。facebook.com次のエラーメッセージ(実行時)が表示されるような一部のページ:

std.net.curl.CurlException@/usr/include/d/dmd/phobos/std/net/curl.d(800): Invalid encoding sequence for enconding 'utf-8'
----------------
./foo(char[] std.net.curl._decodeContent!(char)._decodeContent(ubyte[], immutable(char)[])+0xf6) [0x812e6ba]
./foo(char[] std.net.curl._basicHTTP!(char)._basicHTTP(const(char)[], const(void)[], std.net.curl.HTTP)+0x28e) [0x80f89f6]
./foo(char[] std.net.curl.get!(std.net.curl.HTTP, char).get(const(char)[], std.net.curl.HTTP)+0x8f) [0x80f8737]
./foo(immutable(char)[] teste.get_html(immutable(char)[])+0x112) [0x80f0806]
./foo(_Dmain+0x5f) [0x80f06e3]
./foo(extern (C) int rt.dmain2.main(int, char**).void runMain()+0x14) [0x8138340]
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x18) [0x8137e50]
./foo(extern (C) int rt.dmain2.main(int, char**).void runAll()+0x32) [0x8138382]
./foo(extern (C) int rt.dmain2.main(int, char**).void tryExec(scope void delegate())+0x18) [0x8137e50]
./foo(main+0x94) [0x8137e04]
/lib/libc.so.6(__libc_start_main+0xf3) [0xb7593003]

の場合google.com、私は取得します(私はバイナリを取得していますか?どのように?)

�S��7�砱�y�����g�d��C���|��W��O�s��~����*6��@�4�&�A�J����r▒4=�FT�e�� [...]

それdlang.orgはうまくいくからです。

問題は、それを読む正しい方法は何ですか?ページエンコーディングに依存しません。

これが私のDコードです:

string get_html(string page) {
  auto client = HTTP(); 
  client.clearRequestHeaders();
  client.addRequestHeader("DNA", "1");
  client.addRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
  client.addRequestHeader("Accept-Encoding", "gzip, deflate");
  client.addRequestHeader("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1");
  client.addRequestHeader("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");

  return cast(string)get(page, client);
}

前もって感謝します。

4

2 に答える 2

4

cast(string)get(page, client)UTF-8非シーケンスでは失敗します。

スタンドアロンgetpost関数を使用します。これらは、サーバーの送信ヘッダーに従ってコンテンツをデコードし、有効なを返しますUTF-8

于 2012-08-16T12:02:29.747 に答える
1

curlは本当にgzipとdeflateエンコーディング、およびISO-8859-1文字セットをサポートしていますか?curl自体にサポートするエンコーディングと文字セットを宣言させるのではなく、実際にこれらのヘッダーを自分で指定する必要がありますか?

あなたの質問に答えるには:

問題は、それを読む正しい方法は何ですか?ページエンコーディングに依存しません。

サーバーから送信されたページエンコーディングと文字セットを含むヘッダーを確認し、それらのヘッダーに従ってデータを解釈します(たとえば、zlibを呼び出してデータを解凍または膨張させてから、解凍されたHTMLをUTF-8に変換します)。

于 2012-08-16T10:37:10.867 に答える