1

TIdHttpを使用してWebコンテンツをフェッチします。応答ヘッダーは、コンテンツエンコーディングがutf8であることを示します。コンソールでコンテンツをCP936(簡体字中国語)として印刷したいのですが、実際のコンテンツが読み取れません。

Result := TEncoding.Utf8.GetString(ResponseBuffer);

私はPythonで(httplib2を使用して)同じことを問題なく行います。

def python_try():
    conn = httplib2.HttpConn()
    respose, content = conn.get(...)
    print content.decode('utf8') # readable in console

更新1

生の応答をデバッグしたところ、コンテンツがgzipで圧縮されていることがわかりました。

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: text/html;charset=UTF-8
Transfer-Encoding: chunked
Content-Encoding: gzip
Vary: Accept-Encoding
Date: Mon, 24 Dec 2012 15:27:44 GMT
Connection: Keep-Alive

IdCompressorZLibインスタンスをIdHttpインスタンスに割り当てようとしました。残念ながら、gzip圧縮されたコンテンツを解凍しているときにアプリケーションがクラッシュします。テストアドレスは「http\://www.baidu.com」(encoding = gb2312)です。


更新2

また、ASCII文字のみを含むgzip圧縮されたjqueryスクリプトファイルをダウンロードしようとしました。今回は動作します。これは、Indyライブラリの問題であることを意味します。私が間違っていなかったら、質問を閉じなければなりません。

4

2 に答える 2

2

TIdHTTPTIdCompressorZLibプロパティにコンポーネントが割り当てられている場合は、gzip解凍を処理しTIdHTTP.Compressorます。それ以外の場合は、手動で解凍する必要があります(プロパティが割り当てられていない場合、デフォルトでTIdHTTPはヘッダーは送信されません)。Accept-EncodingCompressor

UTF-8エンコーディングに関しては、オブジェクトを埋める代わりに値を返すオーバーロードされたバージョンのorメソッドTIdHTTPを呼び出す場合は、それも処理します。UTF-8をUTF-16にデコードします。これをCP936に変換するには、RTLに変換を実行させます。TIdHTTP.Get()TIdHTTP.Post()StringTStream

type
  Cp936String = type AnsiString(936);
var
  S: Cp936String;
begin
  S := Cp936String(IdHTTP1.Get(...));
于 2012-12-25T01:00:21.353 に答える
1

自動検出エンコーディングは使用しないでください。確実に実行することはできません。単にContent-Typeヘッダーを信じてください。

Result := TEncoding.Utf8.GetString(ResponseBuffer);

Content-Typeヘッダーが欠落しているか、嘘をついている場合は、エンコーディングを検出する必要があります。UTF-8をCP936と誤検出するアルゴリズムは使用しませんが...

于 2012-12-24T06:58:04.250 に答える