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

问题描述:

我现在正在编写Firefox 4的引导扩展。Firefox扩展中的XMLHTTPRequest上的HTML DOM解析和字符编码


以下是我的故事:

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

我通过将createElement方法和innerHTML属性解析为DOM的responseText到一个BODY元素中。

一切似乎都成功了。

但是,字符编码(charset)存在问题。

由于我需要扩展检测目标文件的字符集,覆盖 Mine类型的请求与文本/ HTML; charset = blahblah ..似乎不符合我的需要。

我已经试过@ mozilla.org /国际/ utf8converterservice 1,nsIUTF8ConverterService,但似乎XMLHTTPRequest的没有ScriptableInputStream甚至任何的InputStream或可读的数据流。

我对阅读在适当的目标文档的内容不知道,自动检测字符集的无论功能自动检测在GUI字符编码,或在内容文档的头部meta标签readed的字符集。


编辑:难道是实际的,如果我解析整个文件包括HTML,头部,身体标记DOM对象,但没有加载了丰富的文档像JS,CSS,ICO文件?

编辑:在上MDC的那篇为 “HTML DOM以” 这是使用@ mozilla.org /馈unescapehtml方法; 1,nsIScriptableUnescapeHTML不适当,因为它有很多的解析错误错误基本URI不能为text/html的设置。 A元素中的所有属性HREF都是,当它包含相对路径时错过了

编辑#2:如果有任何方法可以将传入的responseText转换为可读的UTF-8字符集字符串,它仍然会很好。 :-)


任何想法或解决编码问题的作品都将受到赞赏。 :-)

PS。目标文件普遍所以有没有特定的字符集(或... 预知),当然不仅是UTF8,因为它在默认情况下已经定义。


联党:

直到现在,我有解决这个问题的两个主要的简要观点。

任何人都可以帮助我解决XPCOM模块和方法的名称吗?


指定字符集在分析内容到DOM。

我们需要先知道文档的字符集(通过提取头元标记或标题)。 然后,

  • 找出解析正文内容时可以指定charset的方法。
  • 找出可以解析头部和身体的方法。

转换传入的responseText成/是UTF-8,以便解析到DOM元素与默认字符集UTF-8仍然是工作。

X似乎不实用和合理:在字符集中包含Mine类型是这个想法的实现,但在启动请求之前我们无法预知字符集。

+0

是字符集UTF-8还是真的blahblahblah? – jmort253 2011-05-08 04:33:50

+0

Firefox可以识别的所有字符集,因为在XHR中使用的默认字符集firefox是UTF-8,但是除UTF-8之外,还有很多使用字符集的网站。 – tytsim 2011-05-08 04:36:04

似乎没有更多的其他答案。

经过一天的测试,我发现有一种方法(尽管很笨拙)来解决我的问题。

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

要强制火狐把它当作纯文本 使用用户定义的字符集 。这告诉Firefox不要分析 它,并让字节通过 未处理。

MDC Document: Using_XMLHttpRequest#Receiving_binary_data

然后用编写脚本的Unicode转换@ mozilla.org /国际/ scriptableunicodeconverter,nsIScriptableUnicodeConverter

可变charset可以从头部meta标签不管通过提取正则表达式 from 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元素并满足我的需求。

其他精彩的想法仍然受欢迎。请充分理由反驳我的回答。 :-)