Encoding HttpWebRequest:接收具有正确编码的响应
我目前正在下载一个HTML页面,使用以下代码:Encoding HttpWebRequest:接收具有正确编码的响应,encoding,.net-2.0,httpwebrequest,Encoding,.net 2.0,Httpwebrequest,我目前正在下载一个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
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中指定编码的meta标记,然后重新读取(重新编码?)整个流 任何指点都将不胜感激
更新: 多亏了约翰·桑德斯的回答,我才更接近了。 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做错了什么?我相信HttpWebResponse具有ContentEncoding属性。在StreamReader的构造函数中使用它。Daniel, 有些页面甚至不返回
字符集
中的值,因此这种方法不太可靠。
有时甚至连浏览器都无法“猜测”使用哪种编码,所以我认为您无法进行100%的编码识别
在我的特殊情况下,当我处理西班牙语或葡萄牙语页面时,我使用UTF7编码,它对我来说很好(áíóóúñí…等)
可能您首先可以加载字符集代码及其相应编码的表。如果CharacterSet为空,则可以提供默认编码
StreamReader
构造函数中的detectEncodingFromByteOrderMarks
参数可能会有所帮助,因为它会自动检测或从第一个字节推断一些编码。Gap的站点错误。具体的问题是,他们的页面声称编码为拉丁文1(ISO-8859-1),而页面使用的字符#146在ISO-8859-1中无效
但是,该字符在Windows CP-1252编码(ISO 8859-1的超集)中有效。在CP-1252中,字符代码#146,用于右引号字符。你会在Gap.com主页上今天的文本中看到“Youll find petite and small size”中的撇号
你可以阅读更多细节。事实证明,在内容最初以CP-1252编码保存的网页上(例如,从Word复制/粘贴),这种情况是常见的问题
这个故事的寓意是:在数据库中始终以Unicode格式存储国际化文本,并在web服务器上始终以UTF8格式发出HTML