海外旅行から帰ってきたら、まず何を食べる?

サイトHTMLをWebBrowserを使用せずに取得するために、
Dim stream As System.IO.Stream = client.OpenRead(tbItemURL.Text)
Dim reader As New System.IO.StreamReader(stream)
Dim strHtml = reader.ReadToEnd()
reader.Close()
stream.Close()

のような形で文字列を取得しています。
しかし、この場合Sift-jis等の場合、後の作業(一部データ取得)で文字化けに悩まされます。

http://dobon.net/vb/dotnet/string/detectcode.html
上記サイトで「バイト配列」に格納して判別する方法があります。

そこで、文字列をバイト配列に格納しようとしますが…。
文字列→バイト配列には文字コードが必要となります。

Dim data() As Byte = Encoding.UTF8.GetBytes(text)

なんだか鶏と卵のような感じになってしまいます。

文字列から文字コードを判別する方法はないでしょうか?
よろしくお願いします。

A 回答 (2件)

#1 Wizard_Zeroです。

すみません、ちゃんとテストしないで投稿してしまいました。

以下、修正したコードです。
srmBuffの内容を全てメモリストリームへコピーしてバイト配列を得るようにしました。

Dim client As New Net.WebClient
Dim srmBuff As IO.Stream = client.OpenRead("http://hoge")
Dim bytBuff As Byte() = {}

Using srmMemory As New IO.MemoryStream
Dim bytRead As Byte() = {}, intRead As Integer = 0
Call Array.Resize(bytRead, 1024)

intRead = srmBuff.Read(bytRead, 0, bytRead.Length)

Do While intRead > 0
Call srmMemory.Write(bytRead, 0, intRead)
intRead = srmBuff.Read(bytRead, 0, bytRead.Length)
Loop

bytBuff = srmMemory.ToArray
End Using
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
見事に処理することができました。

とても勉強になりました。
ありがとうございます。

お礼日時:2009/09/01 07:24

StreamReaderではなく、IO.Streamから直接バイト配列で読んでしまえばOKです。



Dim client As New Net.WebClient
Dim srmBuff As IO.Stream = client.OpenRead("http://hoge")
Dim bytBuff As Byte() = {}
Array.Resize(bytBuff, CInt(srmBuff.Length))
srmBuff.Read(bytBuff, 0, bytBuff.Length)

このようにすればアクセスしたWebサイトのHTMLをバイト配列で取得することができます。

この回答への補足

回答ありがとうございます。
Wizard_Zeroさんのご指摘の通り、

1)byteで読み込む
2)エンコードをチェックする
3)文字列に変換する

という流れが良さそうです。

コードを利用させていただきましたが、srmBuff.Lengthのところで、
"このストリームはシーク操作をサポートしません。"
というエラーが発生してしまいます。

google検索してもヒット1件だけで、解決策を導き出せませんでした。
解決策がありましたら、よろしくお願いします。

補足日時:2009/08/28 10:12
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!