- PR -

HTTPのリクエストで文字コードを認識する方法

1
投稿者投稿内容
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-07-06 15:57
HTTPのリクエストで文字コードを認識する方法を教えてください。
JavaのクライアントアプリケーションでHTTPのリクエストを行なう場合、
大体以下のようなコードを書くと思います。
------------------------------------------------------------
URL url=new URL("http://**********");
HttpURLConnection con=(HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.connect();
BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream()));
String field;
while((field=br.readLine())!=null)
System.out.println(field);
con.disconnect();
------------------------------------------------------------

しかしこのやり方では、InputStreamReader()で文字エンコーディングを指定していないために、サイトによっては文字化けを起してしまいます。
getContentType()メソッドを使って charsetを取得する方法を加えてみたのですが、Content-Typeヘッダにcharsetが指定されていないもの多くて改善にはなりませんでした。
次に、HTML文書内のMETA宣言のhttp-equiv属性で設定された Content-Typeヘッダのcharsetパラメータを参照する方法を取ろうと思ったのですが、ここで矛盾にぶつかりました。
取得したcharsetは、InputStreamReader()を呼び出す際のパラメータとして使用したいのに、charsetを取得する為に そのInputStreamReader()を呼び出さなくてはならないからです。
どのように書けばうまく行くのか? ご存知の方がいらっしゃいましたら教えてください。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2005-07-06 18:43
リクエストじゃなくてレスポンスの文字コードですよね。

現状は混沌としているので、けっこう面倒な処理が必要になります。

  1. HTTP ヘッダの Content-Type に charset があれば、それを採用
  2. そうでない場合、バイナリで(ReaderでなくInputStreamで)データを取得して、先頭数バイトを見てUTF-16やBOM付きUTF-8のチェックをする。それらのコードだったら、ここで確定
  3. UTF-16やBOM付きUTF-8でない場合、ASCII互換エンコーディングと仮定して、META http-equivを解析する。そこでcharset指定があれば、そのコードで確定
  4. ここまでで確定しない場合、日本語だと仮定できるなら JISAutoDetect を使う
  5. 日本語でないなら、諦める

Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-07-08 08:19
やはりHTML本文(HTTPレスポンスという言い方で合ってましたでしょうか?)を一度は読むしかないのですね。
試してみて結果が出たらUPします。

スフレ様へ
ご回答 ありがとうございました。
とても勉強になります。
バイナリでのデータ取得についても色々試そうと思っています。
Desmo
大ベテラン
会議室デビュー日: 2004/03/24
投稿数: 149
投稿日時: 2005-07-15 19:04
あるサイトに
「InputStreamReader() のエンコード文字に、
 "JISAutoDetect"
 を指定すると、なぜか自動識別/変換してくれます。」
と書いてありましたので、それに従って
BufferedReader br=new BufferedReader(new InputStreamReader(con.getInputStream(),"JISAutoDetect"));
としたところ、殆どの文字化けが解消されました。
それでも完全ではなく、きちんとcharsetを調べて それを指定しないと正しく表示されないものもありました。
でも逆にcharsetをきちんと指定することでかえって文字化けしてしまうサイトもありました。
例えば、"Shift_JIS"のサイトで '−'や'〜'が、なぜか' ?'に化ける現象がありました。
それもごく僅かでしたけど・・・ しかしブラウザで見ると正しく表示されているのでちょっと腑に落ちない部分ではあります。
ただ私の用途としては、最初に書いた方法でほぼ満足する結果がでました。

1

スキルアップ/キャリアアップ(JOB@IT)