私は使用してorg.apache.commons.httpclient.HttpClient
おり、応答エンコーディングをセットアップする必要があります (何らかの理由で、サーバーが Content-Type で正しくないエンコーディングを返します)。私の方法は、応答を生のバイトとして取得しString
、目的のエンコーディングで変換することです。これを行うためのより良い方法があるかどうか疑問に思っています(例:HttpClientのセットアップ)。提案をありがとう。
4 に答える
HttpClient
3.x APIを使用するより良い答えはないと思います。
HTTP 1.1 仕様では、クライアントは応答ヘッダーで指定された文字セットを「尊重」し、文字セットが指定されていない場合は ISO-8859-1 を使用する必要があると明確に述べています。HttpClient
API は、プログラマーが HTTP 仕様に準拠することを前提に設計されています。明らかに、準拠していないサーバーと通信できるようにするには、仕様のルールを破る必要があります。とはいえ、これは API 設計者が明示的にサポートする必要があると考えたユースケースではありません。
HttpClient
4.xを使用していた場合は、応答メッセージの概念的な文字セットを無視してResponseHandler
、本文を に変換する独自の文字列を作成できます。HttpEntity
いくつかのメモ:
サーバーはデータを提供するため、適切な形式で提供するのはサーバー次第です。したがって、応答エンコーディングはクライアントではなくサーバーによって設定されます。ただし、クライアントは、 Accept および Accept-Charset を介して希望する形式をサーバーに提案できます。
Accept: text/plain Accept-Charset: utf-8
ただし、http サーバーは通常、フォーマット間の変換を行いません。
オプション 1. が機能しない場合は、サーバーの構成を確認する必要があります。
String が生のバイトとして送信される場合 (これはネットワークが送信するものであるため、常にそうです)、定義されたエンコーディングが常に存在します。サーバーはこの未加工のバイトを生成するため、エンコーディングを定義します。そのため、生のバイトを取得して、選択したエンコーディングを使用して文字列を作成することはできません。文字列からバイトへの変換時に使用されたエンコーディングを使用する必要があります。
皆さん、こんにちは。
誰かが HttpClient を UTF-8 で書き込むように設定するためにこの投稿をグーグルで見つけた場合に備えて。
このコード行は便利なはずです...
response.setContentType("text/html; charset=UTF-8");
一番
免責事項: 私は本当に HttpClient を知っているわけではなく、API を読んでいるだけです。
HttpResponse を返す execute メソッドを使用し.getEntity().getContent()
ます。これは純粋なバイト ストリームであるため、サーバーから通知されたエンコーディングを無視したい場合は、独自の InputStreamReader を単純にラップすることができます。
HttpClient
わかりました、間違ったバージョンを持っていたようです (明らかに、クラスが多すぎます)。
ただし、以前と同じように、他のクラスに配置されているだけです。 にHttpMethod
はgetResponseBodyAsStream()
メソッドがあり、その周りに独自の InputStreamReader をラップできます。(または、大きすぎない場合は配列全体を一度に取得し、あなたが書いたように文字列に変換します。)
ここでは、応答を変更して HttpClient に分析させるのは正しい方法ではないと思います。
ただし、間違った文字セットについてサーバー管理者/ウェブマスターにメッセージを送信することをお勧めします。