我当前正在使用以下代码下载 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 中,我将“’”视为“?”
更不用说如果我尝试加载 google.cn 会发生什么......
为了让 .Net 正确编码,我在这里缺少什么?
我最担心的是,我实际上必须读取指定编码的 HTML 内的元标记,然后重新读取(重新编码?)整个流。
任何指示将不胜感激。
UPDATE:
感谢约翰·桑德斯的回复,我距离更近了一些。
HttpWebResponse.ContentEncoding 属性似乎总是为空。然而,HttpWebResponse.CharacterSet 似乎很有用,通过这段代码,我越来越接近:
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)
现在Google.cn 完美地出现了,所有的汉字都显示出来了。
然而,Gap.Com 仍然犯了错误。
对于 Gap.com,HttpWebResponse.CharacterSet 是 ISO-8859-1,我通过 GetEncoding 获得的编码是 {System.Text.Latin1Encoding},其主体名称中显示“ISO-8859-1”,并且内容-在 HTML 中键入 META 标记指定“charset=ISO-8859-1”。
我还是做错了什么吗?
还是GAP做错了什么?