我现在正在编写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 类型与字符集是这个想法的一个实现,但我们在启动请求之前无法预知字符集。