- PR -

HTMLエンコード

投稿者投稿内容
クリス
会議室デビュー日: 2002/10/05
投稿数: 6
投稿日時: 2002-10-07 13:34
こんにちは、


URLConnectionを使って、HTMLページのエンコードを取得したいんですが、失敗します。
getContentEncoding()はnullを戻って、getContentType()は"text/html"だけを戻ります。

HTMLのMETAタグは:
<META http-equiv=content-type content="text/html;charset=UTF-8">

どうすればいいでしょうか?

よろしくお願いします。
クリス
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-07 15:50
Content-Typeフィールドは、HTTPサーバーがセットしていると
思います。
ですので、使用しているHTTPサーバーの設定をする、
ということになるのかな?

http://www.w3.org/International/O-HTTP-charset

ここにちょこっと載っています。
詳しくわからないので的外れかもしれません。
クリス
会議室デビュー日: 2002/10/05
投稿数: 6
投稿日時: 2002-10-07 16:24
ありがとうございました。でも、ちょっと的外れですね。

http://www.w3.org/International/O-HTTP-charset
を見ると、各HTMLページには、charsetは設定されるはずです。
設定されていないと、既定の「ISO-8859-1」に設定されてしまいます。

それに、サーバ側には、この既定値を制御できます。例えば、「.htm」という拡張子に「UTF-8」をマップできます。

そうすると、URLConnectionのgetContentType()の戻り値は「text/html;charset=UTF-8」になります。

しかし、サーバ側のMIMEマップを変えたくありません(まぁ、具体的にサーバをアクセスできません)。
HTMLページにあるエンコードを取得したいんです。つまり、HTMLページにある「<META http-equiv=content-type content="text/html;charset=UTF-8">
」は設定されたら、charsetを取得する方法があるでしょうか?openConnection()をしてから、どうすればいいでしょうか?


よろしくお願いします。
へげもん
ベテラン
会議室デビュー日: 2002/04/14
投稿数: 87
お住まい・勤務地: 埼玉県
投稿日時: 2002-10-07 17:45
<META>タグで宣言されているcharsetの値が知りたいのなら、ページの先頭を読み込んで調べてみれば良いような気がするんですが、だめなんでしょうか?
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-07 17:56
思うにですね、HTTPサーバーは、単純にクライアントから要求された
リソースを返すだけ、つまり中身のエンコーディングなど知らない、
もしくは解析しないんじゃないでしょうか。

具体的に言うと、HTMLで<META>タグを記述しても、HTTPサーバーは
それを親切にもレスポンスヘッダに付けてくれるようなことはしない。
まあ、当然といえば当然な気がしますが。

したがって、おっしゃることを実現するには、
・HTTPサーバーの設定を変える
もしくは
・自分でHTMLを解析する
しかないんじゃないでしょうか。
openConnectionして、InputStreamからHTMLの中身を読み込んで、
自分で<META>タグを探し、charsetの部分を読むしかないのかな。

うーん、また的外れかな?
誰か詳しい人いたらフォローしていただければ
ありがたいです。
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-07 17:58
へげもんさんと内容がぶつかってしまいました。
書いてることは一緒です。

うんうん悩みながら書いているあいだにレスがついて
いたようです。
ひろ
常連さん
会議室デビュー日: 2001/12/13
投稿数: 36
投稿日時: 2002-10-07 18:02
<meta http-equiv>はサーバの実装によってはHTTPヘッダに設定してくれるようです。
でもあまりそういうサーバは多くないみたいで、実際はクライアントがmetaタグを解釈する方が多そうです。

URLconnectionのgetContentEncoding()のソースを見てみましたが、単純に
getHeaderField("content-encoding")としてるだけでした。
それでgetHeaderField(String name)を見てみると
コード:
public String getHeaderField(String name) {
    return null;
}


あれ?常にnullを返してる。
(j2sdk1.4.1&1.3.1)
amnaky
ベテラン
会議室デビュー日: 2002/09/13
投稿数: 75
お住まい・勤務地: 東京
投稿日時: 2002-10-07 18:08
そういうサーバーもあるんですねえ。
nullを返してるのは、
URLConnectionがabstractクラスであって、
実装をサブクラスにまかせているからです。

Template Methodパターンってとこでしょうか。

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