4

我现在正在编写 Firefox 4 引导扩展。


以下是我的故事:

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

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

一切似乎都很成功。

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

因为我需要扩展检测目标文档的字符集,用 text/html覆盖Mine 类型的请求;charset=blahblah.. 似乎不能满足我的需要。

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

我不知道以合适的自动检测字符集读取目标文档内容,无论是 GUI 中的自动检测字符编码功能还是在内容文档的头部元标记处读取的字符集。


编辑:如果我将包括 HTML、HEAD、BODY 标记在内的整个文档解析为 DOM 对象,但不加载像 js、css、ico 文件这样的大量文档,这是否实用?

编辑: MDC 上标题为“ HTML 到 DOM ”的文章上的方法使用@mozilla.org/feed-unescapehtml;1,nsIScriptableUnescapeHTML不合适的,因为它解析了很多错误,并且baseURI的错误不能设置文本/html。A Elements 中的所有属性 HREF 在包含相对路径时都会丢失

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


任何解决编码问题的想法或工作都值得赞赏。:-)

PS。目标文档是通用的,因此没有特定的字符集(或 ... preknown),当然不仅仅是默认定义的 UTF8。


支持:

到目前为止,我有两个解决这个问题的简要主要想法。

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


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

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

  • 找出在解析正文内容时可以指定字符集的方法。
  • 找出一种可以同时解析头部和身体的方法。

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

X 似乎不实用也不明智:用 charset 覆盖 Mine 类型是这个想法的一种实现,但我们不能在发起请求之前预先知道 charset。

4

1 回答 1

1

似乎没有其他答案了。

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

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

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

参考MDC 文档:Using_XMLHttpRequest#Receiving_binary_data

然后使用Scriptable Unicode Converter@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 系列。:-)

然后简单地解析到body元素并满足我的需要。

仍然欢迎其他出色的想法。随意以充分的理由反对我的回答。:-)

于 2011-05-09T13:48:50.440 回答