#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
элемента и удовлетворите мои потребности.
Другие блестящие идеи по-прежнему приветствуются. Не стесняйтесь возражать против моего ответа по достаточной причине. 🙂