HttpWebRequest: получение ответа с правильной кодировкой - PullRequest
2 голосов
/ 12 марта 2009

Я сейчас загружаю 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», И мета-тег Content-Type в HTML, указанный "charset = ISO-8859-1".

Я все еще делаю что-то не так?
Или GAP что-то делает не так?

Ответы [ 3 ]

2 голосов
/ 12 марта 2009

Я считаю, что HttpWebResponse имеет свойство ContentEncoding. Используйте его в конструкторе вашего StreamReader.

1 голос
/ 15 августа 2009

Сайт Gap неверен. Конкретная проблема состоит в том, что их страница требует кодировки Latin1 (ISO-8859-1), в то время как страница использует символ # 146, который недопустим в ISO-8859-1.

Этот символ, однако, действителен в кодировке Windows CP-1252 (которая является надмножеством ISO 8859-1). В CP-1252 код символа # 146 используется для символа правой кавычки. В сегодняшнем тексте на домашней странице Gap.com вы увидите это как апостроф в «Вы найдете маленьких и маленьких размеров».

Вы можете прочитать http://en.wikipedia.org/wiki/Windows-1252 для более подробной информации. Оказывается, что подобные вещи являются распространенной проблемой на веб-страницах, где контент первоначально сохранялся в кодировке CP-1252 (например, копирование / вставка из Word).

Мораль этой истории здесь: всегда сохраняйте интернационализированный текст как Unicode в вашей базе данных и всегда испускайте HTML как UTF8 на вашем веб-сервере!

0 голосов
/ 19 мая 2009

Daniel, Некоторые страницы даже не возвращают значение в CharacterSet, поэтому этот подход не так надежен. Иногда даже браузеры не могут «угадать», какую кодировку использовать, поэтому я думаю, что вы не сможете выполнить 100% -ное распознавание.

В моем конкретном случае, когда я имею дело с испанскими или португальскими страницами, я использую кодировку UTF7 , и она прекрасно работает для меня (все ... и т. Д.).

Может быть, вы сможете сначала загрузить таблицу кодов CharacterSet и их соответствующую кодировку. И если CharacterSet пуст, вы можете предоставить кодировку по умолчанию.

Параметр detectEncodingFromByteOrderMarks в конструкторе StreamReader может немного помочь, поскольку он автоматически обнаруживает или выводит некоторые кодировки из самых первых байтов.

...