INETコントロールでテキスト形式で取得するには

解決


はすもと  2009-07-27 18:10:29  No: 101903  IP: 192.*.*.*

Dim bHtml As String

    bHtml = Inet1.OpenURL(strURL, TypeText)
      
アイネットコントロールを使用して、テキストデータをクリップボード
経由で処理したいと考えていますが、bHtml を調べると文字化けしてし
まっています。文字コードの変換とか行えば出来るのでしょうか
よく分かりませんのでよろしくお願いします。

編集 削除
魔界の仮面弁士  2009-07-27 19:39:50  No: 101904  IP: 192.*.*.*

その元サイトの文字コードが事前に分かっているのであれば、
(テキストモードではなく)バイナリモードを用いて、Byte配列に受け取り、
それを「ADODB.Stream」を使って文字コード変換すれば OK です。


ADODB.Stream を用いた文字コード変換の具体的な例は、ここの掲示板でも
何度か話題になっていますので、過去ログから探してみてください。

編集 削除
はすもと  2009-07-27 21:43:13  No: 101905  IP: 192.*.*.*

魔界の仮面弁士さん有難うございます。
助言を元にやってみたいと思います。
出来ましたらまたご報告いたします。

編集 削除
はすもと  2009-07-28 11:33:35  No: 101906  IP: 192.*.*.*

参考にやってみたのですが、ファイルから読み出してテキストに変換
する事は出来たのですが、一旦ファイルに保存せずに直接デコードした
テキストにする事が出来ません。

    Dim STRURL      As String   ' 取得URL
    Dim bytHtml()   As Byte
        
    STRURL = "http://jp.msn.com/"        

    'ファイルをバイナリモードで読み込み
    bytHtml() = Inet1.OpenURL(STRURL, icByteArray)

    Dim objStream
    Set objStream = CreateObject("ADODB.Stream")
    objStream.Open
    objStream.Charset = "utf-8"
    objStream.WriteText bytHtml()
    Text1.Text = objStream.ReadText()
    objStream.Close

テキストボックスには何も書き出されません。
はっきり言って基本的に理解できていませんが、上のコードを何処を
直せば上手くいくでしょうか

編集 削除
魔界の仮面弁士  2009-07-28 12:09:20  No: 101907  IP: 192.*.*.*

> objStream.WriteText bytHtml()
これでは駄目ですよ。

Textモードで書き込んでしまっては、折角 UTF-8 バイナリで受け取った内容が、
VB 既定の「Shift_JIS バイナリ→UTF-16 バイナリ」変換されてしまいます。

バイナリモードで受けたのですから、書き込みもバイナリモードにせねばなりません。


> Text1.Text = objStream.ReadText()
この段階で、ストリーム内のカーソル位置は、データ末尾にあります。
それ以降にデータは無いため、ReadText は空データとなります。

ReadText 前には
    objStream.Position = 0
を指定して、カーソル位置を先頭に戻す必要があります。


ということで、正解はこちら。
[Microsoft ActveX Data Objects X.X Library] を参照設定してください(2.5以上が必要です)。

bytHtml = Inet1.OpenURL(STRURL, icByteArray)

Dim objStream As ADODB.Stream
Set objStream = New ADODB.Stream
objStream.Open

'バイナリモードとして書きこむ
objStream.Type = adTypeBinary
objStream.Write bytHtml

'先頭に戻して、utf-8 なテキストモードに変更
objStream.Position = 0
objStream.Type = adTypeText
objStream.Charset = "utf-8"

'読み込み
Text1.Text = objStream.ReadText()
objStream.Close


なお、ADO を参照設定せずに、CreateObject で処理したい場合には、
adTypeBinary , adTypeText の定数が未定義になりますので、
Const adTypeBinary As Long = 2
Const adTypeText As Long = 2
のように、自分で定数を定義する必要があります。

編集 削除
はすもと  2009-07-28 20:50:05  No: 101908  IP: 192.*.*.*

魔界の仮面弁士さん有難うございます。

例えば、> Text1.Text = objStream.ReadText()とかobjStream.Position = 0
とかも過去ログを参照しながら色々当てはめてみたのですが、また、ADO を参照設定しているのに、CreateObjectしたりしていました。
上に掲載したソースは、色々やって結局出来なかったので、中途半端なソースを記述した次第です。
ADODB.Streamを使うのは初めてなので、よく分からなかったのですが、ご指導のおかげで断片化された物が繋がってきました。
有難うございます。

編集 削除
魔界の仮面弁士  2009-07-29 09:21:53  No: 101909  IP: 192.*.*.*

ごめんなさい。レイトバインド時の説明に誤りがありました。

> Const adTypeBinary As Long = 2
> Const adTypeText As Long = 2

上記訂正。
後者( adTypeText ) の値は 2 で良いのですが、
前者( adTypeBinary )側は、2 ではなく 1 が正しい値です。


なお、先にはすもとさんの書かれたコードでは、Type プロパティに
どちらの定数も指定されていませんでしたが、初期値は adTypeText で
あるため、この場合はテキストモードとして扱われることになります。

編集 削除