I'm currently downloading an HTML page, using the following code:
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
This works well for most pages, but for some (eg: www.gap.com), I get the response incorrectly encoded.
In gap.com, for example, I get "’" as "?"
And not to mention what happens if I try to load google.cn...
What am I missing here, to get .Net to encode this right?
My worst fear is that i'll actually have to read the meta tag inside the HTML that specified the encoding, and then re-read (re-encode?) the whole stream.
Any pointers will be greatly appreciated.
UPDATE:
Thanks to John Saunders' reply, i'm a bit closer. The HttpWebResponse.ContentEncoding property seems to always come in empty. However, HttpWebResponse.CharacterSet seems useful, and with this code, i'm getting closer:
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)
Now Google.cn comes in perfectly, with all the chinese characters.
However, Gap.Com is still coming in wrong.
For Gap.com, HttpWebResponse.CharacterSet is ISO-8859-1, the Encoding i'm getting through GetEncoding is {System.Text.Latin1Encoding}, which says "ISO-8859-1" in it's body name, AND the Content-Type META tag in the HTML specified "charset=ISO-8859-1".
Am I still doing something wrong?
Or is GAP doing something wrong?