はじめまして。
ExcelVBAにて、Streamオブジェクトを使用し、ホームページのタイトルを取得する処理を作っているのですが、EUC-JPコードの一部で文字化けが発生してしまいます。
Sub ページタイトルの取得実験()
Dim b() As Byte
Dim HttpRequest As Object
Dim ReturnedData , GETURL As String
GETURL = Cells(1, 4)
Set HttpRequest = CreateObject("Msxml2.XMLHTTP")
HttpRequest.Open "GET", GETURL, False
HttpRequest.Send
ReturnedData = HttpRequest.responseText
If InStr(GETURL, "yahoo") <> 0 or InStr(ReturnedData, "UTF-8") <> 0 Or InStr(ReturnedData, "utf-8") <> 0 Then
'TITLEタグを抜き出す処理
ElseIf InStr(ReturnedData, "EUC-JP") <> 0 Or InStr(ReturnedData, "euc-jp") <> 0 Or InStr(ReturnedData, "x-euc-jp") <> 0 Then
ReturnedData = StrConv(HttpRequest.responsebody, vbUnicode)
Dim Stm As ADODB.Stream
Set Stm = New ADODB.Stream
Stm.Open
Stm.Type = adTypeText
Stm.Charset = "Shift_JIS"
Stm.WriteText ReturnedData
Stm.Position = 0
Stm.Type = adTypeBinary
b = Stm.Read()
Stm.Close
Stm.Open
Stm.Type = adTypeBinary
Stm.Write b
Stm.Position = 0
Stm.Type = adTypeText
Stm.Charset = "EUC-JP"
ReturnedData = Stm.ReadText()
'TITLEタグを抜き出す処理
ElseIf InStr(ReturnedData, "x-sjis") <> 0 Or InStr(ReturnedData, "shift_jis") <> 0 Or InStr(ReturnedData, "SHIFT_JIS") <> 0 _
Or InStr(ReturnedData, "Shift_JIS") <> 0 Or InStr(ReturnedData, "charset") = 0 Then
ReturnedData = StrConv(HttpRequest.responsebody, vbUnicode)
'TITLEタグを抜き出す処理
End If
End Sub
と、作っているのですが、他のコードに対してはうまくいくのですが、EUC-JPコードの場合一部文字化けしてしまうものがあります。
例えば「http://www.pc-success.co.jp/」はタイトル取得がうまくいくのですが、「http://www.rakuten.co.jp/」ではうまくいきません。
長文になってしまいましたが、かなり根詰めてしまったので、
皆様の助言、よろしくお願い致します。
IEはv6.0。EXCEL2002/VBAを使用しています。
> ReturnedData = StrConv(HttpRequest.responsebody, vbUnicode)
この時点で、データを破壊してしまっているような。。。
StrConvせず、Byte配列のままバイナリストリームに引き渡してから、
それをEUC-JP形式のテキストストリームとして読み出してみてください。
魔界の仮面弁士様、ご返答ありがとうございます。
さっそく言われたとおりに直してみたところ、見事に文字化けせずに取得できました。
改めてStreamオブジェクトの使い方を覚えることもでき、感謝の限りです。
また行き詰ってしまって根詰めたら、質問をするかもしれませんが、これにて解決です。
本当にありがとうございました。
ツイート | ![]() |