2009-03-12 2 views
2

Я скачиваю страницу HTML, используя следующий код:HttpWebRequest: Получение ответа с правом кодирования

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}, в котором говорится: «ИСО-8859-1» в его имени, И тег META Content-Type в HTML указан «charset = ISO-8859-1».

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

ответ

1

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

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

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

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

2

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

0

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

В моем конкретном случае, как я справляюсь с испанскими или португальскими страницами, я использую кодировку UTF7 и она работает хорошо для меня (áéíóúñÑêã ... и т.д.).

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

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

Смежные вопросы