この問題は、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 )に変更されます