Shift_JISやEUC-JPのページをFessでクロールしたとき、ブラウザーでは読めるのに検索結果のタイトルや本文が文字化けすることがあります。HTTPヘッダーだけで文字コードを指定しているページを正しく扱うため、fess-crawlerのHTTPクライアントとHTML解析処理を修正しました。
HTTPヘッダーのcharsetを使う
従来は文字コードをContent-Encodingから読み取っていました。このヘッダーはgzipなどの圧縮方式を表すもので、文字コードの指定ではありません。修正後はContent-Typeのcharsetを読み取り、HTML側に文字コード指定がない場合も解析処理へ引き継ぎます。HttpClient 4と5の両方が対象です。
Content-Type: text/html; charset=Shift_JIS
例えば実際の本文がShift_JISで、HTMLにmeta charsetがなく、上記のヘッダーだけがあるページが対象になります。EUC-JPも同じ考え方です。新しい有効化設定は追加されていません。
初期値と優先順位
HTML内のmeta charsetがある場合は、その指定が従来どおり優先されます。meta指定がなければクライアントが報告した文字コードを使います。HTTP応答のcharsetが未指定、未対応、または不正な名前の場合の初期値はUTF-8です。文字コードを自動推定する機能ではないので、何も宣言していないShift_JISのページは引き続き文字化けします。
HtmlTransformerのdefaultEncodingは、クライアントからも文字コードが報告されていない場合だけ使われます。HTTPクライアントは未指定時もUTF-8を報告するため、defaultEncodingだけでHTTPページの未指定文字コードを上書きできるとは考えないでください。
クロール先で確認すること
文字化けがあれば、まず応答ヘッダーとHTMLのmeta charset、実際のファイルの文字コードを照合します。ヘッダーもmetaもないページには正しい指定を追加し、本文を再取得してインデックスを更新します。誤ったcharsetを送るサーバーも、ヘッダーが尊重されるようになるため修正が必要です。
ファイル、FTP、SMB、S3、GCS経由のHTMLにも、meta指定がない場合はクライアントの設定charsetが引き継がれます。これらの初期値もUTF-8です。この変更はHTML標準に合わせてヘッダーをmetaより優先する変更ではなく、既存の優先順位を維持しています。