在Firefox扩展中,HTML DOM解析和XMLHTTPRequest的字符编码

4

我现在正在编写Firefox 4启动扩展。


以下是我的故事:

当我使用@mozilla.org/xmlextras/xmlhttprequest;1, nsIXMLHttpRequest时,可以通过req.responseText成功加载目标URL的内容。

我使用createElement方法和innerHTML属性将responseText解析为DOM,并插入到BODY元素中。

一切似乎都很成功。

然而,存在字符编码(charset)问题。

由于需要扩展程序检测目标文档的字符集,因此使用text/html; charset=blahblah..覆盖请求的MIME类型似乎无法满足我的需求。

我尝试了@mozilla.org/intl/utf8converterservice;1, nsIUTF8ConverterService,但似乎XMLHTTPRequest没有ScriptableInputStream或任何InputStream或可读流。

我不知道如何以适当的、自动检测到的字符集读取目标文档内容,无论是GUI中的Auto-Detect Character Encoding函数还是内容文档头部meta标签中读取的字符集。


编辑:如果我将整个文档(包括HTML、HEAD、BODY标记)解析为DOM对象,但不加载大量文档(如js、css、ico文件),这是否可行?

编辑:在MDC上标题为“HTML to DOM”的文章中使用的方法,即使用@mozilla.org/feed-unescapehtml;1, nsIScriptableUnescapeHTML,是不合适的,因为它解析时会出现许多错误和错误,并且在text/html类型中无法设置baseURI。当包含相对路径时,所有A元素中的HREF属性都会丢失。

编辑#2:如果有任何可以将传入的responseText转换为可读的UTF-8字符集字符串的方法,那就太好了。:-)


欢迎提出解决编码问题的任何想法或工作。:-)

PS。目标文档是通用的,因此没有特定的字符集(或...预先知道的),当然不仅限于UTF8,因为其已经默认定义。


SUPP:

到目前为止,我有两个解决这个问题的主要思路。

有人能帮我找出XPCOM模块和方法的名称吗?


将内容解析为DOM时指定字符集。

我们需要首先了解文档的字符集(通过提取head meta标记或头部)。然后,

  • 找出一种能够在解析正文内容时指定字符集的方法。
  • 找出一种能够解析头部和正文内容的方法。

将传入的 responseText 转换或制作为 UTF-8,以便使用默认字符集 UTF-8 解析为 DOM 元素仍然有效。

X 似乎不切实际和明智:覆盖 Mine 类型与字符集是这个想法的一个实现,但我们在启动请求之前无法预知字符集。


字符集是UTF-8还是真的blahblahblah? - jamesmortensen
Firefox可以识别的所有字符集,在XHR中Firefox使用的默认字符集是UTF-8,但仍有许多网站使用除UTF-8之外的字符集。 - tytsim
1个回答

1

看起来没有其他答案了。

经过一天的测试,我发现有一种方法(虽然很笨拙)可以解决我的问题。

xhr.overrideMimeType('text/plain; charset=x-user-defined');,其中xhr代表XMLHttpRequest处理程序。

为了强制Firefox将其视为纯文本,使用用户定义的字符集。这告诉Firefox不要解析它,并让字节通过未经处理的方式传递。

参见MDC Document: Using_XMLHttpRequest#Receiving_binary_data

然后使用可脚本化Unicode转换器@mozilla.org/intl/scriptableunicodeconverter,nsIScriptableUnicodeConverter

变量charset可以从头部元标记中提取,无论是通过req.responseText(具有未知字符集)的正则表达式还是其他方法。

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

一个Unicode字符串,以及UTF-8家族最终被生成。:-)
然后只需解析到元素并满足我的需求。
其他聪明的想法仍然受欢迎。请随意提出充分理由反对我的答案。:-)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接