古いWebサイトには、HTTP応答にもHTMLにも文字コードを書いていない日本語ページがあります。FessのWebクロールでは、このようなShift_JISやEUC-JPのページをUTF-8として読み、検索結果のタイトルや本文が文字化けすることがありました。fess-crawlerの開発ブランチに、HTMLの先頭バイトから文字コードを推定する変更が入りました。
HTML内の宣言を優先する
HTMLから meta charset などの宣言を読み取れた場合は、引き続きその指定を使います。宣言がない場合に限り、HTTPクライアントが報告する文字コードをヒントに、Tikaの検出器が先頭16 KiBを調べます。HTTPの Content-Type に charset がなければ、HTTPクライアントはUTF-8を報告します。このUTF-8も推定のヒントとして扱うため、EUC-JPなどの候補が選ばれる場合があります。
クライアントから報告値がなければ HtmlTransformer の defaultEncoding をヒントにし、これも未設定ならUTF-8を使います。使えない文字コード名の代わりにもUTF-8を使います。先頭がASCIIだけの場合や検出器が候補を返せない場合は、そのヒントに従います。新しい有効化設定は追加されていません。
対象ページを再クロールする
文字化けしているURLについて、HTTP応答の Content-Type、HTML内の宣言、実際の文字コードを照合します。サイトを管理できる場合は正しい文字コードを明記しておくと、短いページや日本語が後半にしか出ないページでも推定に頼らずに済みます。HTML内の宣言が誤っている場合は、その宣言を修正します。
対象の数ページを再クロールし、検索結果でタイトルと本文を確認します。すでにインデックスに入った文字化けは、更新後に対象ページを取得し直して反映します。以前のHTTPヘッダー対応と、ファイルやSMBからの読み取りについては別の記事で扱っています。HTTPヘッダーの文字コード・ファイルクロールの文字コード推定
関連PR
- HTML本文から文字コードを推定 fess-crawler #234
- 本文の追加読み取りをXPathテストに反映 Fess #3746