Синтаксический анализ HTML DOM и кодировка символов в XMLHttpRequest в расширении Firefox

#character-encoding #firefox-addon #xmlhttprequest #html-parsing #gecko

#кодировка символов #firefox-дополнение #xmlhttprequest #html-синтаксический анализ #gecko

Вопрос:

Сейчас я пишу загрузочное расширение firefox 4.


Ниже приводится моя история:

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

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

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

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

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

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

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


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

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

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


Приветствуются любые идеи или работы по решению проблемы кодирования. 🙂

PS. целевые документы универсальны, поэтому нет конкретной кодировки (или … заранее известно), и, конечно, не только UTF8, как это уже определено по умолчанию.


SUPP:

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

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


Чтобы указать кодировку при синтаксическом анализе содержимого в DOM.

Сначала нам нужно узнать кодировку документа (путем извлечения мета-тега head или заголовка). Затем,

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

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

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

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

1. Кодировка UTF-8 или действительно бла-бла-бла?

2. Вся кодировка, которую Firefox может распознать, в качестве кодировки по умолчанию firefox, используемой в XHR, является UTF-8, но есть еще много веб-сайтов, использующих кодировку помимо UTF-8.

Ответ №1:

Кажется, что другого ответа больше нет.

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

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

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

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

А затем используйте конвертер Unicode с возможностью написания сценариев: @mozilla.org/intl/scriptableunicodeconverter, nsIScriptableUnicodeConverter

Переменная charset может быть извлечена из метатегов head независимо от того, с помощью регулярного выражения из 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 элемента и удовлетворите мои потребности.

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