1

次のようなajaxリクエストのX-Messageヘッダーを介してレールでフラッシュメッセージを送信するために、SafariおよびFirefoxでUTF-8文字列を表示する際に問題があります。

class ApplicationController < ActionController::Base
  def flash_to_headers
       return unless request.xhr?
       message = flash_message
       message = "#{message.join("','")}" if message.is_a?(Array)
       response.headers['X-Message'] = message
       response.headers["X-Message-Type"] = flash_type.to_s

       flash.discard # don't want the flash to appear when you reload page
   end

   def flash_message
       [:red, :warning, :notice, :success, nil].each do |type|
         return "" if type.nil?
         return flash[type] unless flash[type].blank?
       end
   end

   def flash_type
       [:red, :warning, :notice, :success, nil].each do |type|
         return "" if type.nil?
         return type unless flash[type].blank?
       end
   end

ヘッダーを処理する Javascript:

var fade_flash = function() {
    $(".flash_alert").fadeIn("fast");
    $(".flash_alert").delay(10000).fadeOut("slow");
};

var show_ajax_message = function(msg, type) {
    $(".flash_message").html('<div class="flash_alert hidden flash_'+type+'">'+msg+'</div>');
    fade_flash();
};

$( document ).ajaxComplete(function(event, request) {
    var msg = request.getResponseHeader('X-Message');
    var type = request.getResponseHeader('X-Message-Type');
    if (msg) {
      show_ajax_message(msg, type);
    }

});

中国語をサポートする l18n ロケールを追加するまで、これはうまく機能していました。Chrome では引き続き動作しますが、Safari と Firefox では、フラッシュ メッセージが正しく表示されなくなりました。

例: "投注金额” 比你的余额多" のようなメッセージは Chrome では問題なく表示されますが、Safari と Firefox では "âæ注éé¢â æ¯ä½ çä½é¢å¤" のように表示されます。

このバグのライブ デモは、https://ice-dice.comで 見ることができます。中国語ロケールの下で [roll] をクリックするだけで、Chrome を使用しない限り、フラッシュ メッセージが正しくないことがわかります。英語ロケールでは、引用符でさえ正しく表示されません。

よろしくお願いします。

4

1 に答える 1

0

HTTP ヘッダーは、ISO-8859-1 データを伝送するために RFC 2616 で指定されています。Safari と Firefox は正しいことをしています。HTTP 標準によれば、HTTP ヘッダー値に漢字を入れることはできません。

ここではブラウザーの動作に一貫性がありません (Opera も UTF-8 を使用し、IE はロケール ANSI コード ページが何であれ使用します)。そのため、HTTP ヘッダーで非 ASCII 文字を使用することは安全ではありません。

ヘッダーを使用する必要がある場合の通常の回避策は、両端にアドホック エンコーディングを適用することです。通常は、UTF-8 バイトを介した URL エンコーディングまたは base64 エンコーディングです。ただし、通常は、任意のデータを HTTP ヘッダーでラップしないことをお勧めします。代わりに本体に入れます。

于 2013-10-02T21:01:14.903 に答える