投稿/コメントを表示します。

小川さん

お世話になっております。
本日は少し長いですが、よろしくお願いいたします。
DOMとして取得したレスポンスボディの文字化けに関する質問です。

以下のコードは本講座のエクセルテキストの01_WinHttp_基本の中にあるm01010_getモジュールのGetRequestSimple1()サブプロシージャです。

Sub GetRequestSimple1()
Dim url As String
url = "http://www.exvba.com/ws/dombasic.html"

Dim xh As New WinHttp.WinHttpRequest 'HTTPリクエストを制御するクラスのインスタンスを生成
xh.Open "GET", url, False
xh.send

Dim sCode As String
sCode = xh.Status
If sCode <> 200 Then 'ステータスコードを調べる
MsgBox "リクエストに失敗しました" & vbNewLine & sCode
End If

'まずは、レスポンスヘッダー、レスポンスボディをざっくり取得してみよう
Dim sHead As String
Dim sBody As String
sHead = xh.GetAllResponseHeaders
sBody = xh.ResponseText

Worksheets("response").Range("B1").Value = sHead
Worksheets("response").Range("B2").Value = sBody

'レスポンスヘッダーの所定の項目を取得したいときは以下の要領
Debug.Print xh.GetResponseHeader("Content-Length")
End Sub

当然問題なく動いてレスポンスヘッダ、ボディともにちゃんと取れます。
しかし、対象のurlをShift_JISで記載されているページにしたら、とれてきたレスポンスボディの日本語部分が文字化けしていました。
そこで自分なりに調べて、
sBody = xh.ResponseText の部分を
→ sBody = StrConv(xh.ResponseBody, vbUnicode)  に変更したら
文字化けが解消しました。

ここまでだったらよかったのですが、次に、本講義テキストの02_WinHttp_DOM解析ファイルのm02010_get_DOMモジュールの
GetRequestSimple1()プロシージャを使って、上記と同じようにurlを
Shift_Jisで記載されているページにしたら、取得したレスポンスはやはり文字化けします。
しかし、こちらは自力では解決できませんでした。上記で解決したコードも試しましたが、よけい変な文字になってしまいました。
たとえば以下のようにしてみました。

本講義のテキストのコード
Sub GetRequestSimple1()
Dim url As String
url = "http://www.exvba.com/ws/dombasic.html"

Dim xh As New WinHttp.WinHttpRequest
xh.Open "GET", url, False
xh.send

Dim sCode As String
sCode = xh.Status
If sCode <> 200 Then
MsgBox "リクエストに失敗しました" & vbNewLine & sCode
End If

'htmlをDOMとして取得する。そのための変数を宣言。
Dim oHTml As New MSHTML.HTMLDocument
oHTml.body.innerHTML = xh.ResponseText 'htmlボディーをDOMとして取得

'所定のIDの要素を取得します
Dim oH1 As MSHTML.HTMLHeadElement
Set oH1 = oHTml.getElementById("h1_01")
Debug.Print oH1.outerHTML
Debug.Print oH1.innerHTML
Debug.Print oH1.innerText

'所定の要素の次の要素を取得します
Debug.Print oH1.NextSibling.outerHTML
Debug.Print oH1.NextSibling.innerHTML
Debug.Print oH1.NextSibling.innerText

'HTMLBody全体を取得します
Dim oH As MSHTML.HTMLBody
Set oH = oHTml.getElementsByTagName("body")(0)
Debug.Print oH.outerHTML
Debug.Print oH.innerHTML
Debug.Print oH.innerText

'HtmlBodyの子要素のうち4番目のものを取得します
Debug.Print oH.ChildNodes(3).outerHTML
Debug.Print oH.ChildNodes(3).innerHTML
Debug.Print oH.ChildNodes(3).innerText

'H2タグのついた要素すべてを順番に調べます
Dim oH2 As MSHTML.HTMLHeadElement
For Each oH2 In oHTml.getElementsByTagName("h2")
Debug.Print oH2.outerHTML
Debug.Print oH2.innerHTML
Debug.Print oH2.innerText
Next
End Sub

上記テキストコードの中で以下の部分を
'HTMLBody全体を取得します
Dim oH As MSHTML.HTMLBody
Set oH = oHTml.getElementsByTagName("body")(0)
Debug.Print oH.outerHTML

変更後
'HTMLBody全体を取得します
Dim oH As MSHTML.HTMLBody
Set oH = oHTml.getElementsByTagName("body")(0)
Debug.Print StrConv(oH.outerHTML, vbUnicode)

としましたが、余計、文字化けがひどくなってしまった例です。

根本的なところが分かっていないと思いますが、ご指導いただけますと幸いです。
よろしくお願いいたします。
2020/04/28 19:13