目前,我正在下载HTML网页,使用了下列代码:

Try
    Dim req As System.Net.HttpWebRequest = DirectCast(WebRequest.Create(URL), HttpWebRequest)
    req.Method = "GET"
    Dim resp As Net.HttpWebResponse = DirectCast(req.GetResponse(), Net.HttpWebResponse)
    Dim stIn As IO.StreamReader = New IO.StreamReader(resp.GetResponseStream())
    Dim strResponse As String = stIn.ReadToEnd

    ''Clean up
    stIn.Close()
    stIn.Dispose()
    resp.Close()

    Return strResponse

Catch ex As Exception
    Return ""
End Try

这适用于大多数页面,但是对于某些(如:www.gap.com),我得到的回应不正确的编码。
在gap.com例如,我得到"'"为"?"
并不是说会发生什么,如果我尝试。cn...

什么我错过了这里,获得。净进行编码这个吗?

我最怕的是我会实际上已经阅读元标记的内部HTML,指定了编码,然后再阅读(重新编码的?) 整个流。

任何指针将被极大的赞赏。


更新:

感谢约翰*桑德斯'应答的,我有点接近。该HttpWebResponse.ContentEncoding酒店似乎总是空的。然而,HttpWebResponse.字符集似乎很有用,并与这样的代码,我越来越接近:

Dim resp As Net.HttpWebResponse = DirectCast(req.GetResponse(), Net.HttpWebResponse)
Dim respEncoding As Encoding = Encoding.GetEncoding(resp.CharacterSet)
Dim stIn As IO.StreamReader = New IO.StreamReader(resp.GetResponseStream(), respEncoding)

现在谷歌。cn来完美,所有的中国文字。
但是,Gap.Com 仍然是即将在错误的。

对于Gap.com,HttpWebResponse.字符集是ISO-8859-1、编码我得到通过GetEncoding是{系统。的文本。Latin1Encoding},其中说,"ISO-8859-1",在它的体的名称和内容类型元标记的HTML指定的"charset=ISO-8859-1".

我仍然做错了什么?
或是差距做错了什么?

有帮助吗?

解决方案

间隙的网站是错误的。具体问题是,他们的网页的权利要求一个编码的Latin1(ISO-8859-1),而网站使用的字符#146这不是有效的ISO-8859-1.

这个角色是,但是,有效的Windows CP-1252编码(这是一个扩展的ISO8859-1).在CP-1252、字符编码#146和使用权的报价符。你会看到这一省略号的"你会发现Petites和小尺寸",在今天的文本Gap.com 主页。

你可以阅读 http://en.wikipedia.org/wiki/Windows-1252 更多的细节。事实证明这种事情是一个共同的问题网页上的内容最初是存在CP-1252编码(例如复制/粘贴从字)。

道德的故事在这里:总是存国际化的文本,作为Unicode在你的数据库,并且总是发HTML为UTF8在你的网服务器!

其他提示

我认为,HttpWebResponse有ContentEncoding财产。用它在构造你的StreamReader.

丹尼尔, 一些网页,甚至不值返回中 CharacterSet, ,因此这种做法是不那么可靠。有时甚至没有浏览器能够"想",其中编码使用,所以我觉得你不能做到100%的enconding识别研究.

在我的特别情况下,作为我处理与西班牙或葡萄牙语页面,我用的 UTF7 编码与它工作正常对我来说(áéíóúñÑêã...等等)。

可能是你可以第一载表的字符集码及其相应编码。和中情况的字符集是空的,你可以提供默认的编码。

detectEncodingFromByteOrderMarks 参数 StreamReader 构造,可以帮助一点,因为它会自动发现或推断出的一些编码,从第一个字节。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top