HTMLファイルを使用する場合のSprockets 3のエンコードの問題

少し前に、私はプロジェクトの1つをRails 4.2にアップグレードし、興味深い効果に気付きました。アセット内の処理済みhtmlファイルのエンコードがISO-8859-1に変更されました。



この問題は、Sprockets 3.0.0および3.0.1に関連しています。



問題はEncodingUtils#detect_htmlで見つかりました:



#... module Sprockets # Internal: HTTP transport encoding and charset detecting related functions. # Mixed into Environment. module EncodingUtils extend self #... # Public: Detect charset from HTML document. Defaults to ISO-8859-1. # # str - String. # # Returns a encoded String. def detect_html(str) str = detect_unicode_bom(str) # Attempt Charlock detection if str.encoding == Encoding::BINARY charlock_detect(str) end # Fallback to ISO-8859-1 if str.encoding == Encoding::BINARY str.force_encoding(Encoding::ISO_8859_1) end str end CHARSET_DETECT[:html] = method(:detect_html) end end
      
      







ファイルをダウンロードするとき、SprocketsはUnicode標準を決定し、BOMから行を削除し、目的のエンコードでそれを返そうとします。 htmlの場合、この段階でエンコードを判別できなかった場合、charlock_holmesに(インストールされている場合)行わせようとします。そうでない場合は、強制的にISO-8859-1に変換します。



問題は、BOMはUTF-8に必須ではないため、ほとんどすべてのエディターがBOMなしでファイルをUTF-8に保存することです。 これは、 `detect_unicode_bom`メソッドがほとんどの場合役に立たず、アセット内のhtmlファイルが常にISO-8859-1に変換されることを意味します。



次の方法で問題を解決できます。



1.初期化子でテキスト/ htmlのMimeタイプをオーバーライドします。



 Rails.application.assets.register_mime_type('text/html', extensions: '.html', charset: :default)
      
      





2. charlock_holmesを設定します。



3.バージョン3.0.2にアップグレードします。デフォルトの動作はISO-8859-1からEncoding.default_external( pull request )に変更されます



All Articles