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

『Inet』につきまして

環境/言語:[WindowsXP , Visual Basic2003]
分類:[.NET]

初めまして。sasakiと言います。
ご教授頂ければ幸いです。

只今、WebからHTMLソースを表示してリッチテキストボックスに写す、
というものを.NETにて作成しています。
HTMLソースを表示するだけは、色々なサイトで参照しながらできました。

問題はURLを入力するところなのですが、
なぜか文字化けをしてしまったり、全く表示できなかったりしてしまいます。
(全てのURLでやっているわけではないのですが…)
Yahoo!のあるページは文字化けしてしまったり、
海外のHPを参照すると表示できなかったりします。
色々と試したのですが、エンコードの問題でもなかったです。

それを回避するためにVB6.0では『Inet』というものを使用するらしいのですが、
.NETでそれに変わるものはあるのでしょうか?
探してはみたのですが見つからなく質問させて頂いた次第です。

不明な点がございましたらご指摘下さい。
宜しくお願いします。
正直、私には意味がさっぱり分かりません。もしURLをテキストボックスに入力しているとすれば、URLが文字化けしたり、表示されないということは、テキストボックスに正しい文字列を入力できないということですか?
おはようございます。

昨日の続きですが、説明がかなり足りない部分がありました。
ちなみに下記コードです。

※フォームにはテキストボックス1、ボタン1、リッチテキストボックス1があります。
--------------------------------------------------------------------

Try
Dim strURL As String
Dim NwWebClient As New WebClient
Dim bBuffer As Byte()
Dim strHTML As String

'URL
strURL = TextBox1.Text
'データを取得
bBuffer = NwWebClient.DownloadData(strURL)
'エンコード処理
strHTML = Encoding.Default.GetString(bBuffer)
'ページソースを表示
RichTextBox1.Text = strHTML

Catch webEx As WebException
'エラー表示
RichTextBox1.Text = webEx.ToString()
End Try

--------------------------------------------------------------------

となっています。
上記コードはテキストボックスにURLを入力、ボタンで取得、取得したソースをリッチテキストボックスに表示という処理です。

リッチテキストに表示される際に、文字化けを起こしてしまいます。
「このURLだと文字化けしない」、「このURLだと文字化けする」、「このURLだとソースを取得できない」
等があります。

その問題を解決するために、VB6.0では『Inet』を使用するらしいのですが、
.NETにはないそうです。
『Inet』と同じ処理を行うものがあれば教えて頂きたいと思い、
質問させて頂いた次第です。

説明不足ですみませんでした。
宜しくお願いします。
> ※フォームにはテキストボックス1、ボタン1、リッチテキストボックス1があります。

なるほど。
ということなら「Inet 云々」はきれいさっぱり忘れてください。

> 上記コードはテキストボックスにURLを入力、ボタンで取得、取得したソースをリッチテキストボックスに表示という処理です。
>
> リッチテキストに表示される際に、文字化けを起こしてしまいます。
> 「このURLだと文字化けしない」、「このURLだと文字化けする」、「このURLだとソースを取得できない」
> 等があります。

「文字化けする」原因はあきらかです。

>'エンコード処理
>strHTML = Encoding.Default.GetString(bBuffer)

が、まずいです。
HTML コンテンツは様々な文字コードで記述されている(日本語のページの場合 Sjift_JIS, JIS, EUC-jp の3種がメジャー)ので、どんな文字コード体系(=Encoding)で記述されているのかを調べてから、適切な変換を行わなければなりません。

しかしながら、「どんな文字コード体系が使用されているか」を調べるための簡単な方法は .NET の標準ライブラリには含まれていません。
自作するなどして入手しなくてはなりません。
(100%確実な方法は無いので例は紹介しません。「文字コード 検出」などを検索語にして検索してみてください。)

ソースが取得できない理由は分かりません。
その URL はブラウザでは閲覧できているのでしょうか?
渋木宏明さんご回答ありがとうございます。

> 「文字化けする」原因はあきらかです。
>
> >'エンコード処理
> >strHTML = Encoding.Default.GetString(bBuffer)

> しかしながら、「どんな文字コード体系が使用されているか」を調べるための簡単な方法は .NET の標準ライブラリには含まれていません。
> 自作するなどして入手しなくてはなりません。
> (100%確実な方法は無いので例は紹介しません。「文字コード 検出」などを検索語にして検索してみてください。)

こちらに関してはやはりエンコードの問題とお見受けしました。
検索してみます。ありがとうございます。

> ソースが取得できない理由は分かりません。
> その URL はブラウザでは閲覧できているのでしょうか?

はい。一応IEでは表示されます。(IEでなくても表示すると思います)
しかしやはりソースは取得できません。
先程のコードを使ってソースを取得しようとすると、以下のエラーメッセージがリッチテキストに表示されます。

------------------------------------------------------------------
System.Net.WebException: リモート サーバーがエラーを返しました : (403) 使用不可能
at System.Net.HttpWebRequest.CheckFinalStatus()
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.HttpWebRequest.GetResponse()
at System.Net.WebClient.DownloadData(String address)
at test.Form1.GetHTML() in C:\Documents and Settings\(省略)\Form1.vb:line 1217
------------------------------------------------------------------

『line 1217』は、『bBuffer = NwWebClient.DownloadData(strURL)』
でした。
拒否されているのかエラーではじかれてしまいます。
そこで『Inet』の登場となるワケだったんですが…
VB6.0をインストールしていないので、本当はVB6.0があれば解消する可能性も無いわけではないらしいです。

自分で少しやってみたいと思います。
何かご指摘がございましたら
宜しくお願いします。
> こちらに関してはやはりエンコードの問題とお見受けしました。

そのとおりです。

Encoding.Default は、標準的な日本語版の Windows の環境では Shift_JIS を返します。
HttpWebRequest によって取得したコンテンツが EUC-jp で記述されていた場合、それを Encoding.Default.GetString() すれば文字化けするのは道理です。

>>ソースが取得できない理由は分かりません。
>>その URL はブラウザでは閲覧できているのでしょうか?
>
> はい。一応IEでは表示されます。(IEでなくても表示すると思います)
> しかしやはりソースは取得できません。

ブラウザでソースを表示することは出来ていますか?

> System.Net.WebException: リモート サーバーがエラーを返しました : (403) 使用不可能
(略)
> 拒否されているのかエラーではじかれてしまいます。

サーバエラーコードの 403 は「アクセス不可」を表しています。
サーバ側で UserAgent をチェックしていて、HttpWebRequest にからのアクセスが拒絶されてているのかもしれません。
渋木宏明さんご回答ありがとうございます。

> Encoding.Default は、標準的な日本語版の Windows の環境では Shift_JIS を返します。
> HttpWebRequest によって取得したコンテンツが EUC-jp で記述されていた場合、それを Encoding.Default.GetString() すれば文字化けするのは道理です。

しかしEncodingクラスを使用すると、
・ASCII
・BigEndianUnicode
・Default
・Unicode
・UTF7
・UTF8
の6つしかエンコードの種類がありません。この場合は他でやるべきですか?
それとも他にやる方法がありますか?

> >>ソースが取得できない理由は分かりません。
> >>その URL はブラウザでは閲覧できているのでしょうか?
>>
>>はい。一応IEでは表示されます。(IEでなくても表示すると思います)
>>しかしやはりソースは取得できません。
>
> ブラウザでソースを表示することは出来ていますか?

ブラウザもソースを表示することは可能でした。

> サーバエラーコードの 403 は「アクセス不可」を表しています。
> サーバ側で UserAgent をチェックしていて、HttpWebRequest にからのアクセスが拒絶されてているのかもしれません。

アクセスが拒絶されているのを許可するか、他の方法しか無さそうですね。
それも含めて模索してみます。
> しかしEncodingクラスを使用すると、
(略)
> の6つしかエンコードの種類がありません。この場合は他でやるべきですか?
> それとも他にやる方法がありますか?

Encoding.GetEncoding() してください。

> アクセスが拒絶されているのを許可するか、他の方法しか無さそうですね。

「アクセスを許可する」のはサーバ側の話です。

クライアントがやるべき/出来ることは、「サーバがアクセスを許可するような何か(=おそらくは IE と同じ User-Agent ヘッダを送出すること)」です。
>>ブラウザでソースを表示することは出来ていますか?
> ブラウザもソースを表示することは可能でした。

であれば『InetSpy』などを使って、ブラウザからの要求(リクエスト)と、
それに対するサーバ側の応答(レスポンス)の内容が、VB からの要求と
どのように異なっているのかを、比較してみては如何でしょう。
http://hide.maruo.co.jp/software/inetspy.html


・ブラウザからの要求は、(HTTPの)GETメソッドになっているのか。
・Referer ヘッダや User-Agent を指定するとどうなるか。
・そもそも、サーバから渡されるデータの文字コードは何であるか。
> ・ブラウザからの要求は、(HTTPの)GETメソッドになっているのか。

おお、このパターンもありますね。
  • 題名: Re[8]: 『Inet』につきまして
  • 著者: sasaki
  • 日時: 2006/01/26 11:41:54
  • ID: 14699
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
渋木宏明さんご回答ありがとうございます。
返答が遅れてしまいすみませんでした。

> Encoding.GetEncoding() してください。
上記で作成してみます。

> クライアントがやるべき/出来ることは、「サーバがアクセスを許可するような何か(=おそらくは IE と同じ User-Agent ヘッダを送出すること)」です。

User-Agentヘッダですね。
送出することで認識させます。

少しずつですが理解してきました。
ありがとうございます。
宜しくお願いします。
魔界の仮面弁士さんご回答ありがとうございます。

さっそく魔界の仮面弁士さんの方法をやってみたいと思います。
回答が遅れてしまいすみませんでした。

魔界の仮面弁士さんからご指摘されました、
『InetSpy』を使って色々なサイトを検証してみました。
InetSpyを使用するとソースは取得できるのに、
なぜ私のは取得してくれないの…とチョットショックを受けつつやりました。

> ・そもそも、サーバから渡されるデータの文字コードは何であるか。
その際のWebサーバの応答が、
『iso-8859-1』(ヨーロッパサッカーを見たかったから)ときました。

> ・ブラウザからの要求は、(HTTPの)GETメソッドになっているのか。
POSTではないみたいです。(だからGETなはずです。)

色々調べたうちに『MSXML』使ったやり方が一番いいらしいのですが、
コピペして使用したところ、案の定エラーが出てしまいました(^^;)

…以上が結果です。
宜しくお願いします。
>その際のWebサーバの応答が、
>『iso-8859-1』(ヨーロッパサッカーを見たかったから)ときました。

HTTP ヘッダの Encoding はあまりあてになりません。
Webサイト全体で固定の値である場合が多々あるためです。

HTML コンテンツ内の META ヘッダに Encoding があれば、それが一番信頼できます。
HTML コンテンツが特定の言語で記述されていることが期待できる場合、自動判定もまぁまぁあてになります。

>…以上が結果です。
>宜しくお願いします。

残念ですね。
文字の Encoding や Web の仕組みについてもっと勉強しないと、これ以上の進展は難しいと思います。

その上で、HTML コンテンツの取得が「うまくいく場合」と「うまくいかない場合」の差を細部にわたって入念に比較してみる他ないでしょう。

# 差し支えなければ「うまくいかない」URL をいくつか挙げてみてください。
渋木宏明(ひどり)さんご回答ありがとうございます。
>
> # 差し支えなければ「うまくいかない」URL をいくつか挙げてみてください。
>
…なぜかうまくできました。
なにか設定がおかしかったのかもしれません。
よく分からないのですが。
出来たので一応OKとします。またダメになるかもしれませんが。

> 残念ですね。
> 文字の Encoding や Web の仕組みについてもっと勉強しないと、これ以上の進展は難しいと思います。
そうですね。本当に勉強不足でした。
分かりづらい説明でみなさんにご迷惑おかけしてすみませんでした。
もうチョット基礎から学んできます。

また分からないところがあると思います。
そのときもご教授頂ければ幸いです。
ありがとうございました。
解決にチェックしてませんでした。
解決済み!
  • 題名: 【報告】この投稿はマルチポストです
  • 著者: (報告)
  • 日時: 2006/02/01 0:52:49
  • ID: 14791
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
この投稿はマルチポストです。

●マルチポストされている場所
http://www2.moug.net/bbs/program/20060125000001.htm

----------
この掲示板ではマルチポストが禁止されています。詳しくは、「書き込みのマナーについて」をお読みください。

●書き込みのマナーについて
http://dobon.net/vb/bbs/index.html

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