- - PR -
Web上のデータの文字化け
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-11-07 19:33
WebBrowserでWebページに接続するものを作っているのですが、
<DIV><A href="http〜 となっている部分で、 <DIV>.InnserHTMLとした場合は正しく取得できるのに、 <A>.GetAttribute("href")とした場合は文字化けしてしまう箇所があります。 例えば、ヤフーで「ウィキペディア」で検索するとそうなります。 そのサンプルです。 ’Webbrowserコントロールを追加 Public Class Form1 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.WebBrowser1.Navigate("http://search.yahoo.co.jp/search?p=%A5%A6%A5%A3%A5%AD%A5%DA%A5%C7%A5%A3%A5%A2&fr=top_v2&tid=top_v2&ei=euc-jp&search.x=1&x=0&y=0") Application.DoEvents() With WebBrowser1 While .IsBusy Or .ReadyState <> WebBrowserReadyState.Complete Application.DoEvents() End While End With Dim doc As HtmlDocument = WebBrowser1.Document Dim liTagCollection As HtmlElementCollection = doc.GetElementsByTagName("OL")(0).Children For Each liTag As HtmlElement In liTagCollection Debug.Print(liTag.Children(0).InnerHtml) Debug.Print(vbCrLf) Debug.Print(liTag.Children(0).Children(0).GetAttribute("href")) Stop Next End Sub End Class 文字コードの問題かとも思ったのですが、 HttpUtility.UrlDecode(value,System.Text.Encoding.GetEncoding("UTF-8")) などとしてみても直りません。 原因分かる方いらっしゃいますか? | ||||
|
投稿日時: 2006-11-07 20:05
ei=euc-jp ってなってるし、EUC-JP でデコードすれば良いんじゃないですか? | ||||
|
投稿日時: 2006-11-07 22:46
レスどうもです。
>ei=euc-jp ってなってるし、EUC-JP でデコードすれば良いんじゃないですか? ダメでした。 例で示した、 Debug.Print(liTag.Children(0).InnerHtml) では"%E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2"という文字列が取得でき、これをHttpUtility.UrlDecodeすると(エンコードを指定しなくても) 「ウィキペディア」とデコードされます。 しかし、 同じ箇所を取得しているはずの Debug.Print(liTag.Children(0).Children(0).GetAttribute("href")) ではその箇所が ウィキペディア になってしまうのです。 (数値文字参照になっています) [ メッセージ編集済み 編集者: hei 編集日時 2006-11-07 22:54 ] | ||||
|
投稿日時: 2006-11-08 11:15
うーん、何ででしょう。
最初のサンプルを僕の環境で実行したら InnerHtml でも GetAttribute でも同じ URL が取得できました。 (UrlDecode したらウィキペディアが出てきた) 実体参照をデコードしたいなら UrlDecode でなく HtmlDecode かなーとも思うけれど、 明らかに実体参照のコードがおかしいような。。。 | ||||
|
投稿日時: 2006-11-08 11:49
全く外していたらすみませんが、
IEの、ツール→インターネットオプション→詳細設定→常にUTF-8としてURLを送信する はどうでしょうか? | ||||
|
投稿日時: 2006-11-08 13:02
環境を変えて3台のPCで試しましたが、
同じように文字化けしてしまいました。 >冬寂さん もともとその設定になっていました。 逆にはずしてもみましたがダメでした。 %E3%82%A6%E3%82%A3%E3%82%AD%E3%83%9A%E3%83%87%E3%82%A3%E3%82%A2 以外の箇所は liTag.Children(0).Children(0).GetAttribute("href") でも問題なくとれるのですが・・・ [ メッセージ編集済み 編集者: hei 編集日時 2006-11-08 13:02 ] [ メッセージ編集済み 編集者: hei 編集日時 2006-11-08 13:14 ] | ||||
|
投稿日時: 2006-11-08 14:12
URLエンコードされているhref部分を、GetAttributeが勝手に(euc-jpではないエンコーディングで)
デコードしてしまっている、ということでしょうね。そのエンコーディングを指定する箇所が あればいいのですがね。 | ||||
|
投稿日時: 2006-11-08 15:58
どうも「仕様」らしいですね。
上位要素のInnerHTMLから取得することにします。 みなさん、ありがとうございました。 |