2013年2月13日水曜日

Sphinx:検索結果が文字化ける場合の対策

仕事でSphinx使っていて、趣味でSphinxのテーマを作ってます。

Sphinx1.1からは、日本語もちゃんと検索出来るようになったので、
隠していた検索ボックスを表示するようにしました。

Sphinxの検索機能では、

conf.pyでhtml_copy_source = Trueを指定していると、
検索時に検索結果を表示してくれます。

この結果表示は、ソースファイルのコピーを参照して、
そのままhtmlに表示しているので、
ソースとhtmlの文字コードを変えていると、文字化けが発生します。

その対策方法を書きます。

────────────────────────────

対策方法(その1)searchtools.jsを書き換える

IE6~9を無視すれば以外と簡単です。
以下の2つの記事を参照して、searchtools.jsの処理を一部変えてみたところ、Firefoxで動作するところまで確認しました。




しかし、職場で使っているのは主にIE8なので、上記の対策では無理でした。
頑張って、以下の記事に書いてある内容を取り込めばうまくいきそうなのですが、ブラウザの場合分けとか書くのは美しくないと思ったので試してないです。

対策案(その2)ソースファイルコピー時に文字コードを変換させる

Sphinxがソースファイルをコピーする処理を改造して、htmlの文字コードに合わせて文字コードを変換するようにれば良いはずです。
でもガリガリ書く気力が対策案1の途中で尽きてしまったので試せてません。


対策案(その3)ソースとhtmlのエンコーディングをあわせる

これが一番簡単だと思います。

私の場合、もともと以下のような設定だったのですが、
source_encoding = 'mbcs'
html_output_encoding = 'utf-8'
これをこう変えました。
source_encoding = 'utf-8'
html_output_encoding = 'utf-8'
文字コードを変換するpythonスクリプトとかいるので、結構めんどかったです。
本当は、こんな感じにしたいのですが、
source_encoding = 'mbcs'
html_output_encoding = 'mbcs'
いろいろ問題が見つかったので、諦めました。

1 件のコメント:

  1. すみません。うそ書いていたので修正しました。
    修正前は、mbcsにそろえればうまくいくと書いてましたが、これは間違いです。

    utf-8にそろえたら文字化けしなくなったので、きっとmbcsにそろえればいいんじゃないかなぁと思い、未検証のまま載せちゃってました。
    検証してみたらダメダメだったので、記事を修正しました。

    駄目な理由は以下の二つみたいです。
    1. htmlヘッダに、html_output_encodingで指定した値が文字コードとして出力されるが、mbcsは一般的な文字コード名ではない。
    そのため、ので、ブラウザはうまく文字コードを判定できない。
    これが原因で出力したhtml全体が文字化けする。
    2. テンプレート(layout.htmlとか)をいじれば、ヘッダの問題は回避できる。
    しかし、結局、javascriptの処理がutf-8を前提にしているらしく、文字化けしてしまう。

    結論。
    source_encoding も html_output_encoding も utf-8にあわせる。

    返信削除