Кодировка отсутствует в заголовке HTTP, как найти ее в заголовке HTML?(IPhone) - PullRequest
2 голосов
/ 09 августа 2011

Я пишу браузер для iPhone.

Я использую

NSString* storyHTML = @"";
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];

для загрузки HTML. Проблема иногда заключается в том, что в заголовке HTTP нет кодировки, и в этом случае по умолчанию код по умолчанию - Latin-ISO.

В этом случае я могу прочитать до заголовка в HTML и найти метатег, который указывает фактическую кодировку. Который выглядит примерно так:

<meta http-equiv="content-type" content="application/xhtml+xml; charset=UTF-8" />

Проблема в том, что в метатеге можно найти ТОННУ возможных кодировок: http://www.iana.org/assignments/character-sets

Мне нужно кое-как преобразовать одну из этих строк кодирования в одну из константных кодировок, найденных в классе NSString:

 enum {
   NSASCIIStringEncoding = 1,
   NSNEXTSTEPStringEncoding = 2,
   NSJapaneseEUCStringEncoding = 3,
   NSUTF8StringEncoding = 4,
   NSISOLatin1StringEncoding = 5, ...

Должен быть класс, который каким-то образом определяет кодировку HTML для вас. Есть ли способ заглянуть в UIWebView и посмотреть, как они это делают?

Кажется, загрузка HTML должна быть простой, что я пропускаю?

Спасибо!

Ответы [ 2 ]

1 голос
/ 10 августа 2011

Просто округлю мои комментарии и добавлю несколько заключительных слов совета в ответ.


Комментарий 1:

Из общего использования вы можете использовать ASIHTTPRequest -responseString, в противном случае вы можете использовать сами данные и использовать собственную логику, чтобы выяснить, какой тип кодировки (UTF8, UTF16 и т. Д.)


Комментарий 2:

Извеб-сайт ASIHTTP:

ASIHTTPRequest попытается прочитать кодировку текста полученных данных из заголовка Content-Type.Если он находит кодировку текста, он установит responseEncoding для соответствующего NSStringEncoding.Если он не находит кодировку текста в заголовке, он будет использовать значение defaultResponseEncoding (по умолчанию это NSISOLatin1StringEncoding).> Когда вы вызываете [request responseString], ASIHTTPRequest попытается создать строку из полученных данных, используя responseEncoding в качестве исходной кодировки.


Комментарий 3

См.также: Проблема кодирования с ASIHttpRequest


Я бы лично порекомендовал взять данные ответа и просто предположить, что содержимое может вписаться в UTF16 (или 8).Конечно, вы также можете использовать парсер регулярных выражений или HTML для захвата тега <meta> внутри элемента <head>, но если ответ имеет странный тип содержимого, вы не сможете найти строку @"<head"

Я бы также использовал curl из CLI на вашем компьютере, чтобы увидеть, какие типы контента выбирает ASIHTTPRequest.Если вы выполните команду типа

curl -I "http://www.google.com/"

Вы получите следующий ответ:

HTTP / 1.1 200 OK

Дата: Вт, 09 авг. 2011 г. 20:05:00 GMT

Срок действия истекает: -1

Cache-Control: private, max-age = 0

Content-Type: text/ HTML;charset = ISO-8859-1

Похоже, что почти все сайты правильно отвечают этим заголовком, и если я не думаю, что использование UTF8 было бы хорошей идеей.Не могли бы вы прокомментировать ссылку на сайт, на котором возникла проблема?

0 голосов
/ 09 августа 2011

Есть ли способ заглянуть в UIWebView и посмотреть, как они это делают?

Есть. UIWebView - это оболочка для WebKit , которая является проектом с открытым исходным кодом. Вы можете проверить исходный код или просмотреть онлайн.

...