4

私は今、Firefox4のブートストラップされた拡張機能を書いています。


以下は私の話です:

@ mozilla.org / xmlextras / xmlhttprequest; 1、nsIXMLHttpRequestを使用している場合、ターゲットURLのコンテンツをreq.responseTextで正常にロードできます。

createElementメソッドとinnerHTMLプロパティを使用してresponseTextをDOMに解析し、BODY要素にしました。

すべてが成功しているようです。

ただし、文字エンコード(charset)には問題があります。

拡張機能が必要なため、ターゲットドキュメントの文字セットを検出し、Mineタイプのリクエストをtext/htmlでオーバーライドします。charset =blahblah..私のニーズを満たしていないようです。

@ mozilla.org / intl / utf8converterservice; 1、nsIUTF8ConverterServiceを試しましたが、XMLHTTPRequestにはScriptableInputStreamがなく、InputStreamや読み取り可能なストリームさえないようです。

GUIでの文字エンコードの自動検出の機能や、コンテンツドキュメントのヘッドメタタグで読み取られた文字セットに関係なく、適切な自動検出された文字セットでターゲットドキュメントのコンテンツを読み取ることについてはわかりません。


編集: HTML、HEAD、BODYタグを含むドキュメント全体をDOMオブジェクトに解析し、js、css、icoファイルなどの広範なドキュメントを読み込まない場合は実用的でしょうか?

編集:@ mozilla.org / feed-unescapehtml;1を使用している「HTMLtoDOM」というタイトルのMDCの記事のメソッド、 nsIScriptableUnescapeHTMLは多くのエラーで解析され、baseURIのタイプで設定できないため不適切です。 text/html相対パスが含まれている場合、A要素のすべての属性HREFが失われます。

編集#2:着信responseTextを読み取り可能なUTF-8文字セット文字列に変換できるメソッドがあればそれでもいいでしょう。:-)


エンコーディングの問題を解決するためのアイデアや作業は大歓迎です。:-)

PS。ターゲットドキュメントはユニバーサルであるため、特定の文字セット(または... preknown)はなく、もちろん、デフォルトですでに定義されているUTF8だけではありません。


供給:

今まで、私はこの問題を解決するための2つの簡単な主なアイデアを持っています。

誰かが私がXPCOMモジュールとメソッドの名前を理解するのを手伝ってくれるでしょうか?


コンテンツをDOMに解析するときに文字セットを指定します。

最初にドキュメントの文字セットを知る必要があります(ヘッドメタタグまたはヘッダーを抽出することによって)。それで、

  • 本文の内容を解析するときに文字セットを指定できるメソッドを見つけてください。
  • 頭と体の両方を解析できる方法を見つけてください。

着信responseTextをUTF -8に変換または作成して、デフォルトの文字セットUTF-8を使用してDOM要素に解析することは引き続き機能します。

Xは実用的で賢明ではないようです:Mineタイプをcharsetでオーバーライドすることはこのアイデアの実装ですが、リクエストを開始する前にcharsetを事前に知ることはできません。

4

1 に答える 1

1

これ以上の答えはないようです。

1 日のテストの後、私の問題を解決する方法があることがわかりました (不器用ではありますが)。

xhr.overrideMimeType('text/plain; charset=x-user-defined');ここで、xhr は XMLHttpRequest Handler を表します。

ユーザー定義の文字セットを使用して、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 に答える