Разбор HTML DOM и кодировка символов в XMLHTTPRequest с расширением Firefox - PullRequest
4 голосов
/ 08 мая 2011

Я сейчас пишу загрузочное расширение Firefox 4.


Вот моя история:

Когда я использую @mozilla.org/xmlextras/xmlhttprequest; 1, nsIXMLHttpRequest , содержимое целевого URL может быть успешно загружено с помощью req.responseText.

Я проанализировал responseText в DOM с помощью метода createElement и свойства innerHTML в элемент BODY.

Кажется, все успешно.

Однако существует проблема с кодировкой символов (кодировка).

Поскольку мне нужно, чтобы расширение определяло кодировку целевых документов, переопределяет Тип запроса Mine с text / html; charset = blahblah .. кажется, не удовлетворяет мою потребность.

Я пробовал @mozilla.org/intl/utf8converterservice; 1, nsIUTF8ConverterService , но похоже, что XMLHTTPRequest не имеет ScriptableInputStream или даже любого InputStream или читаемого потока.

Я не имею представления о чтении содержимого целевого документа в подходящем, автоматически определяемом кодировке, независимо от функции автоматического определения кодировки символов в графическом интерфейсе или кодировки, прочитанной в метатеге заголовка содержимого документ.


РЕДАКТИРОВАТЬ: Было бы целесообразно, если бы я анализировал весь документ, включая теги HTML, HEAD, BODY, в объект DOM, но не загружая расширенные документы, такие как файлы js, css, ico?

РЕДАКТИРОВАТЬ: Метод статьи в MDC под названием " HTML to DOM ", который использует @mozilla.org/feed-unescapehtml; 1, nsIScriptableUnescapeHTML является неуместным , так как анализируется с большим количеством ошибка и ошибка с baseURI Нельзя установить в типе текст / HTML . Все атрибуты HREF в элементах A пропущены , если он содержит относительный путь .

РЕДАКТИРОВАТЬ # 2: Было бы хорошо, если бы были какие-либо методы, которые могут конвертировать входящий responseText в читаемые строки кодировки UTF-8. : -)


Любые идеи или работы для решения проблемы кодирования приветствуются. : -)

PS. целевые документы: универсальные , поэтому нет конкретного набора символов (или ... preknown ) и Конечно, не только UTF8, как это уже определено по умолчанию.


SUPP:

До сих пор у меня есть две основные идеи решения этой проблемы.

Может кто-нибудь помочь мне разобраться с названиями модулей и методов XPCOM?


К Укажите кодировку при анализе контента в DOM.

Сначала нужно узнать кодировку документа (извлекая метатег заголовка или заголовок). Тогда

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

В Преобразовать или Сделать Входящий responseText в / быть UTF-8, поэтому синтаксический анализ элемента DOM с набором символов по умолчанию UTF-8 все еще работает.

X кажется не практичным и разумным: переопределение типа Mine с помощью charset является реализацией этой идеи, но мы не можем заранее знать charset перед началом запроса.

1 Ответ

1 голос
/ 09 мая 2011

Похоже, другого ответа больше нет.

После дня испытаний я обнаружил, что есть способ (хотя и неуклюжий) решить мою проблему.

xhr.overrideMimeType('text/plain; charset=x-user-defined');, где xhr обозначает обработчик XMLHttpRequest.

Чтобы заставить Firefox обращаться с ним как с простым текст, используя пользовательский символ задавать. Это говорит Firefox не разбирать и пропустить байты необработанный.

Относится к Документ MDC: Using_XMLHttpRequest # Receiving_binary_data

А затем используйте Scriptable Unicode Converter : @mozilla.org/intl/scriptableunicodeconverter, nsIScriptableUnicodeConverter

Переменная charset может быть извлечена из мета-тегов head независимо от regexp из req.responseText (с неизвестным набором символов) или другим способом.

var unicodeConverter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
unicodeConverter.charset = charset;
str = unicodeConverter.ConvertToUnicode(str);

Строка Unicode, а также семейство UTF-8, наконец, создаются. : -)

Тогда просто проанализируйте элемент body и удовлетворите мою потребность.

Другие блестящие идеи все еще приветствуются. Не стесняйтесь возражать против моего ответа по достаточной причине. : -)

...