6

最近、最小限の HTTP CGI サーバーが組み込まれた Winamp Web ソング リクエスター プラグインである Winamp ソング リクエスターをインストールしました。

プラグインが行うことは、Web サーバーを実行し、要求に応じて実際のデータ (プレイリスト、要求キュー、曲の残り時間など) に置き換えるいくつかの特別な変数を含む html ページを提供することです。

これは jQuery を学ぶための楽しくて良いプロジェクトだと思ったので、独自の js コードを接続して、プラグインから提供された Web サイトを置き換え、修正し、ajaxify し始めましたが、文字エンコーディングの問題に遭遇しました。

このページには、プレイリスト内のすべての曲へのリンクが表示されます。リンクの 1 つをクリックすると、独自の jQuery クリック関数を接続しました。そのため、曲をリクエストするときにページ全体をリロードする代わりに、$.get($(this).attr('href', function(response) {... code ...})replaceWith を使用して、現在のキューを新しく生成されたキューに置き換え、リクエストをその場で追加します。現在再生中および検索時に同じことを表示/更新して、すべてがバックグラウンドでフェッチされ、追加されたアニメーションでその場で置き換えられるようにします。

すべての jQuery/Ajax は問題なく動作しますが、大きな問題は文字セットとキュー/プレイリストの曲名にあります。名前の特殊文字 (åäöé など) はまったく機能しません。

プラグインは iso-8859-1/latin1 にすべてを出力し、マークアップのメタ タグは、このページが latin1 であることをブラウザーに伝えます。ブラウザでの通常のページ更新では、これはうまく機能し、特殊文字は通常どおり表示されます。しかし、jQuery を使用$.get()してその場でコード ブロックを置き換えると、特殊文字は ? としてのみ表示されます。

$.get()問題は、jQuery のデフォルトが、ヘッダーに別の指示がない場合、応答が UTF-8であると信じていることにあると思います。プラグインは、encoding/charset のヘッダーをまったく設定しません。バックエンドとどのヘッダーが設定されるかをまったく制御できないため、これを変更することはできません。

プラグインからの応答で得られる唯一のヘッダーは次のとおりです。

サーバー: WinampServer
接続: 閉じる
コンテンツ タイプ: text/html

私の問題を理解していただければ幸いです。バックエンドをまったく制御できず、処理する必要があるのは生成された HTML だけであるページがあります。応答のヘッダーを変更または追加できません。特殊文字のエンコーディングが壊れないように、応答が実際には UTF-8 ではなく latin1 であることを jQuery に伝える必要があります。jQuerys ajaxSetup で scriptCharset: 'iso-8859-1' を試しましたが、それはタイプ script/json でのみ機能し、HTML 応答で作業しています。

これが可能かどうか、または考えられる他の回避策はありますか?

4

3 に答える 3

29

編集:わかりましたこれはうまくいくと思います(少なくとも私のテスト環境ではうまくいきました。以前の試みのリビジョンを参照してください)

$.ajaxSetup({
    'beforeSend' : function(xhr) {
        xhr.overrideMimeType('text/html; charset=UTF-8');
    },
});
$('#stuff').load('/yourresource.file'); // your ajax load

私が持っていたのは、メインファイルセットUTF-8とデータファイルセットでしたISO-8859-1。上記のコードがないと、予想どおり、テスト文字列åäöéのゴミがたくさんありました。上記のコードでは、適切にエンコードされたåäöéがロードされました。

于 2008-12-01T09:51:09.127 に答える
0

最初は、より一般的な $.ajax() 関数を使用した方がよいでしょう。

ドキュメントによると、scriptCharset オプションがありますが、特定のデータ型にのみ適用されます。これは、呼び出しページのエンコーディングが異なる場合にのみ必要であるとも述べられています。

于 2008-12-01T11:16:45.973 に答える
0

これは、overrideMimeType() メソッドが Gecko ベースのブラウザー (Firefox など) で使用可能である一方で、IE (少なくとも <=7) では使用できず、回避策がないように思われることを指摘するためのものです。(他のブラウザでの利用可能性については知りません。)

于 2008-12-11T15:35:09.753 に答える