Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encoding HttpWebRequest:接收具有正确编码的响应_Encoding_.net 2.0_Httpwebrequest - Fatal编程技术网

Encoding HttpWebRequest:接收具有正确编码的响应

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

我目前正在下载一个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中指定编码的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