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 )に変更されます

Source: https://habr.com/ru/post/J256523/


All Articles