Dim bHtml As String
bHtml = Inet1.OpenURL(strURL, TypeText)
アイネットコントロールを使用して、テキストデータをクリップボード
経由で処理したいと考えていますが、bHtml を調べると文字化けしてし
まっています。文字コードの変換とか行えば出来るのでしょうか
よく分かりませんのでよろしくお願いします。
その元サイトの文字コードが事前に分かっているのであれば、
(テキストモードではなく)バイナリモードを用いて、Byte配列に受け取り、
それを「ADODB.Stream」を使って文字コード変換すれば OK です。
ADODB.Stream を用いた文字コード変換の具体的な例は、ここの掲示板でも
何度か話題になっていますので、過去ログから探してみてください。
魔界の仮面弁士さん有難うございます。
助言を元にやってみたいと思います。
出来ましたらまたご報告いたします。
参考にやってみたのですが、ファイルから読み出してテキストに変換
する事は出来たのですが、一旦ファイルに保存せずに直接デコードした
テキストにする事が出来ません。
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
テキストボックスには何も書き出されません。
はっきり言って基本的に理解できていませんが、上のコードを何処を
直せば上手くいくでしょうか
> 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
のように、自分で定数を定義する必要があります。
魔界の仮面弁士さん有難うございます。
例えば、> Text1.Text = objStream.ReadText()とかobjStream.Position = 0
とかも過去ログを参照しながら色々当てはめてみたのですが、また、ADO を参照設定しているのに、CreateObjectしたりしていました。
上に掲載したソースは、色々やって結局出来なかったので、中途半端なソースを記述した次第です。
ADODB.Streamを使うのは初めてなので、よく分からなかったのですが、ご指導のおかげで断片化された物が繋がってきました。
有難うございます。
ごめんなさい。レイトバインド時の説明に誤りがありました。
> Const adTypeBinary As Long = 2
> Const adTypeText As Long = 2
上記訂正。
後者( adTypeText ) の値は 2 で良いのですが、
前者( adTypeBinary )側は、2 ではなく 1 が正しい値です。
なお、先にはすもとさんの書かれたコードでは、Type プロパティに
どちらの定数も指定されていませんでしたが、初期値は adTypeText で
あるため、この場合はテキストモードとして扱われることになります。
ツイート | ![]() |