DOBON.NET DOBON.NETプログラミング掲示板過去ログ

HTMLファイルから文字セットを調べ方

環境/言語:[Windows XP]
分類:[.NET]

よろしくお願いします。
HTMLファイルから文字セット「ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8 」が
どれに属しているか調べることのできます方法または参考になりますものがありま
したら、宜しくお願いいたします。
> HTMLファイルから文字セット「ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8 」が
> どれに属しているか調べることのできます方法または参考になりますものがありま
> したら、宜しくお願いいたします。

META タグを調べます。

Google: html head meta charset
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLG,GGLG:2006-06,GGLG:ja&q=html+head+meta+charset
> HTMLファイルから文字セット「ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8 」が
> どれに属しているか調べることのできます方法または参考になりますものがありま
> したら、宜しくお願いいたします。


1 HTMLのヘッダーの文字コード宣言を取得したいのですか?
  <meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">

2 文字コードの不明なHTMLを読んで,文字コードの判別がしたいのですか?

3 VB2005のWebBrowserコントロールに読み込んだときにWebBrowserが
  どんな文字コードに判定したか知りたいのですか。
渋木さん、YASさん早々、ご返答ありがとうございました。

>2 文字コードの不明なHTMLを読んで,文字コードの判別がしたいのですか?
はい2番です。お聞きしたいのですがHTMLの容量が多きい場合は時間がかかる
のでしょうか。
HTMLのソース表示は前もってISO-2022-JP, Shift_JIS, EUC-JP, UTF-8 が一致
していないと文字化けしますので(ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8)
のどれに属しているか調べてから取得してからソース表示と思っています。
本当は自動的に認識して表示してくれれば一番よいのですが。


Encoding.GetEncoding("Shift_JIS")

よろしくお願いいたします。
2006/03/03(Fri) 01:21:43 編集(投稿者)

> HTMLのソース表示は前もってISO-2022-JP, Shift_JIS, EUC-JP, UTF-8 が一致
> していないと文字化けしますので(ISO-2022-JP, Shift_JIS, EUC-JP, UTF-8)
> のどれに属しているか調べてから取得してからソース表示と思っています。

文字コードを判別する方法は非常に難しいです。
残念ながら文字コードを判別するクラスや関数はありません。
「文字コード 判別」で検索すれば,たくさん出てきますので参考に
してください。

> 本当は自動的に認識して表示してくれれば一番よいのですが。

WebBrowserコントロールに読み込ませれば,一応自動的に判別してくれ
ます。(間違えるときもありますが。)

WebBrowser.Navigate("xxxxxx.html")
DocumentCompletedイベント後に,
WebBrowser.Document.Encoding
で文字エンコーディングを取得できます。
YASさん、ご返答ありがとうございました。
「文字コード 判別」は簡単でないことがわかりました。
WebBrowser.Navigate("xxxxxx.html")
で挑戦してみたいと思います。
深夜に渡りご指導をして頂きまして、ありごとうございました。
解決はしていませんが簡単でない事が分かりましたので
別方法を考える事に致しましたので解決とさせてもらいました。
ありごとうございました。
解決済み!
文字コードを調べる方法は、私のサイトで紹介しています。

DOBON.NET .NET Tips - 文字コードを判別する
http://dobon.net/vb/dotnet/string/detectcode.html
解決済み!
管理人さん、ご返答ありがとうございました。
日頃より「どぼん!のプログラミング道掲示板」さん
には大変お世話にになりまして、この場をお借りして
お礼の挨拶といたします。本当にありがとうございました。
管理人さんの文字コードを調べる方法を、紹介して下さいまして
お礼を申し上げます。これから試してみたいと思います。
ありごとう御座いました。
参考例のhttp://www.yahoo.co.jpの文字コードを判別する事は可能でしょうか。
もし、可能でありましたらどのようにしてTextBox1.Textから文字コードを判別に
結びつければよいのか分かりません。.NETはまだ、知識がありませんので宜しくお
願いします。

参考例を使用させてもらいました。
>Dim webClient As New System.Net.WebClient()
>Dim sr As System.IO.Stream = webClient.OpenRead("http://www.yahoo.co.jp")
>Dim srRead As New System.IO.StreamReader(sr)
>TextBox1.Text = srRead.ReadToEnd()
>srRead.Close()

> DOBON.NET .NET Tips - 文字コードを判別する
> http://dobon.net/vb/dotnet/string/detectcode.html

宜しくお願いいたします。
> 参考例のhttp://www.yahoo.co.jpの文字コードを判別する事は可能でしょうか。

たとえば yahoo の場合には
Dim ContentType As String = webClient.ResponseHeaders.Item("Content-Type")
などとすれば、"text/html;charset=euc-jp" のような文字列が返されるので、
ここから、"euc-jp" である事がわかります。


Web サーバ側が、Charsetを送出してくれていない場合には、返される本文を
自力で解析するしか無いと思います。その場合には、
>> DOBON.NET .NET Tips - 文字コードを判別する
>> http://dobon.net/vb/dotnet/string/detectcode.html
で記載されているような、IMultiLanguage2.DetectInputCodepage メソッドを
用いる方法などを試してみてください。
魔界の仮面弁士さん、ありがとうございます。

.NETは間もありませんので確認するまで時間が要すると思いまが今から
Dim ContentType As String = webClient.ResponseHeaders.Item("Content-Type")
で行ってみます。ありがとうございました。
魔界の仮面弁士さん、ありがとうございます。
TextBox2.Text = ContentType
で確認する事ができました。
一番短くなりますので使用させてもらいます。
これで何とか目的を得る事ができました。
本当にありがとうございました。
解決済み!
> TextBox2.Text = ContentType
> で確認する事ができました。
> 一番短くなりますので使用させてもらいます。
> これで何とか目的を得る事ができました。


それって一番最初のレスの渋木宏明(ひどり)さんの書いたことですよ。

私の3つの質問で言うと1番の「HTMLのヘッダーの文字コード宣言を取得したいのですか?」のことです。

Content-Typeは常にあるとは限りませんから,それに頼らずに自力で文字コードを判別したいのかと思っていました。
> それって一番最初のレスの渋木宏明(ひどり)さんの書いたことですよ。
> 私の3つの質問で言うと1番の「HTMLのヘッダーの文字コード宣言を取得したいのですか?」のことです。
や、私が提示したのは、それらの方法ではありません。

> Content-Typeは常にあるとは限りませんから,
そう、それが問題なんですよね…。(^^;

# だからあくまで、「yahoo の場合には」という条件付きだったわけで。
YAS さん、ありごとうございます。
Urlを変えて行いましたらContent-Typeは常にない事がはかりました。
またHTMLのヘッダーも常にない事があったかと思っていました?。
それにより自力でしかないのかと思いました?。今になって渋木宏明(ひどり)さん
のMETA タグを調べます事の意味・YAS の言っておりました非常に難しい意味が
分かってきました。まだ、.NETは間もない所もありますのでご理解下さい。
宜しくお願いいたします。
魔界の仮面弁士さん、ありごとうございます。

>たとえば yahoo の場合には
を見落としていました。
大変申し訳ありませんでした。
宜しくお願いいたします。
> 一番短くなりますので使用させてもらいます。

ちゃんと内容を理解して使ってますか?

Content-Type ヘッダが送信される時もあれば、送信されないときもあります。

「Yahoo だから全部同じ」わけでも無いのです。

あれだけ大きなポータルになると、複数のサーバで運用されているので、Content-Type を返すサーバもあれば、返さないサーバもあります。

さらに言えば、Content-Type はサーバ設定で固定的な内容を送出してくることが多いので、Content-Type に記載の Encoding と、実際のコンテンツの Encoding が異なっていることも珍しくありません。

なので、すでに示されていますが、以下の3つの方法を組み合わせるのが最良です。

・META タグの Content-Type の charset を見る
・HTTP ヘッダの Content-Type の charset を見る
・本文から類推する
渋木宏明(ひどり)さん、ありごとうございます。
言われる通りちゃんと内容を理解できていなかったことが原因で
ご指導して頂きました皆様方には大変ご迷惑をお掛けしてしまいました。
大変すみませんでした。今後はこのような事が無いようにと思います。
>・META タグの Content-Type の charset を見る
>・HTTP ヘッダの Content-Type の charset を見る
>・本文から類推する
につきましては今後の参考にさせてもらいたいと思いますので
宜しくお願い致します。ありがとうございました。
2006/03/03(Fri) 14:20:04 編集(投稿者)

>や、私が提示したのは、それらの方法ではありません。

申し訳ありません。あまり理解しないで書いてしまいました。

>Dim ContentType As String = webClient.ResponseHeaders.Item("Content-Type")

これはプロトコルのヘッダを見ていると理解しています。
私はこのプロトコルのヘッダというのはHTMLのMETAタグを参照して
送られてくるのだと思っていました。

>さらに言えば、Content-Type はサーバ設定で固定的な内容を送出してくることが多い
>ので、Content-Type に記載の Encoding と、実際のコンテンツの Encoding が異なっ
>ていることも珍しくありません。

恥ずかしい。知りませんでした。

スレッドの本題から外れて大変申し訳ありませんが,勉強させてください。

>や、私が提示したのは、それらの方法ではありません。

は,プロトコルのヘッダを調べるのと,HTMLのヘッダを調べるのは方法として
違うということをおっしゃっているのでしょうか。
YAS さん、ありごとうございます。
大変申し訳ありません。ヘッダと言いますとHTMLヘッダの
名前しか覚えていません。プロトコルのヘッダにつきましては
知りませんでした。
> これはプロトコルのヘッダを見ていると理解しています。
そうです。HTTPの「応答ヘッダ」ですね。
METAタグの方は補助的なものですから、記述されない事も多いかと。

ただ、HTTP ヘッダの Content-Type は、殆どの Web サーバが返すとはいえ、
そこに Charset の指定があるとは限りません。


> 私はこのプロトコルのヘッダというのはHTMLのMETAタグを参照して
> 送られてくるのだと思っていました。
本来はそのような動作が期待されているのですが、実際には、
「ブラウザ側が判断するため」に使われるという状況ですね。

ほとんどの Web サーバは META タグを自動的に読み取るような実装には
なっていなかったりします。そもそも、文字コードが不明なドキュメントの
タグを認識しようという事自体、サーバにとっては面倒な作業なので、
別の場所で設定させる場合が多いかと。(たとえば .htaccess)


> プロトコルのヘッダを調べるのと,HTMLのヘッダを調べるのは方法として
> 違うということをおっしゃっているのでしょうか。
はい。別の方法なので、異なる結果となる可能性があります。

たとえば、
http://www.htmlhelp.com/ja/reference/html40/head/meta.html
は、HTTP応答ヘッダからは iso-2022-jp という情報が得られますが、
HTTP応答本文には、METAタグによる charset 指定はありません。

逆に、
http://www.google.co.jp/
は、HTTP応答ヘッダに charset 指定は無く、本文のMETAタグのみです。
# しかも google は、HTTP要求の内容を見てクライアントを判断し、その時々で
# Shift_JIS だったり UTF-8 だったりと、その内容を切り替えてきたりします。


また、ひどりさんも書かれていますが、サイトによっては、これらの指定が
食い違っている事さえあります。今まで見た中で最悪なパターンとしては、
 ・応答ヘッダは 『Content-Type: text/html; charset=shift_jis』
 ・でも実体は、『euc-jp な文字列』
 ・そして『<meta http-equiv="Content-Type" content="test/html; charset=iso-2022-jp">』
ってのがありました。見事に全部食い違っていたという……。

# 第一、"test/html" ってのはどういう事なんだか。(泣)
ノリオさん,便乗質問をしてすみませんでした。

魔界の仮面弁士さん,詳しく教えて頂き,ありがとうございました。
HTTPプロトコルのヘッダとHTMLファイルのヘッダのContent-Typeの
違いがよくわかりました。

> # 第一、"test/html" ってのはどういう事なんだか。(泣)

自分のページにMETAタグのContent-Typeにいろいろ書いて試してみました。
基本的に何を書いてもHTMLと解釈されてBodyの内容が表示されました。

(text/plainと書いてもHTMLと解釈されました。不思議です??)

charsetにでたらめを書くと,IEが文字をみて自動判別するようです。
> ただ、HTTP ヘッダの Content-Type は、殆どの Web サーバが返すとはいえ、
> そこに Charset の指定があるとは限りません。

経験則で言うと、サーバの Content-Type が一番信用できません。

使用されている言語が明らかな場合は自動判定もそれなりに信用できますが、100%の精度を望むのは無理があります。

HTML に関して言えば、META タグで Content-Tyep が示されていれば、それが最も信憑性が高いと考えることにしています。
(自分で書いてるか、編集ツールが埋め込んでくれているはずなので)

> # 第一、"test/html" ってのはどういう事なんだか。(泣)

以前、ROBOT の説明をしているページの META タグがスペルミスしていて苦笑した記憶がw

DOBON.NET | プログラミング道 | プログラミング掲示板