MitakeSearchを無理矢理Unicode(UTF8)対応にする


  • 公開:
  • 更新:
  • 編集:
概要 ▶ MitakeSearch V4.2(hp.com)を会社のWEBサイトの検索エンジンとして使っています。非公式サポートサイトMitakeSearch INFO(usagi.org)さんからもリンクが張ってあってちょっと笑えた。話は違うのですが会社のサーバーにMovableType商用版をインストールして色々やってみようと思ったわけですよ。それでMovableTypeには検索機能があるのですけれども
MitakeSearch V4.2(hp.com)を会社のWEBサイトの検索エンジンとして使っています。非公式サポートサイトMitakeSearch INFO(usagi.org)さんからもリンクが張ってあってちょっと笑えた。

話は違うのですが会社のサーバーにMovableType商用版をインストールして色々やってみようと思ったわけですよ。それでMovableTypeには検索機能があるのですけれども、なんかショボイのね。検索は速いけど…あと、何か複数のblogを立てていると、そっちも検索してしまうのは何か設定を間違っているのかなぁ…というわけで、色々悩んだり検索したりするのは面倒なので(本業じゃないし…)既に設置してあるMitakeSearchで検索することにしました。

…が、MovableTypeはUTF8で表示しています。MitakeSearchはUTF8には対応していません。正しくいえば、インデックスは作成出来ますが、UTF8のページにフォームを作ると文字化けして検索できません。がびーん。シフトJISとかEUCにしか対応していないじゃんか。

頭に来たので「search.pl」を書き換えます。hackっていうんですか?これ?(違

その前にMovableTypeの検索の際に「KCODE」のvalueを「UTF」とかにしておきます。あと、Jcode.pm(ring.gr.jp)をインストールしておきます。

書き換える場所は次の所。
最初の方に
use Jcode;
と書きます。
次に以下の所を探します。
# code
if ($M_KCODE =~ m/SJIS/i)
	{ $SEARCH = &sjis2ujis($SEARCH);
	$M_HOST = &sjis2ujis($M_HOST);
	$M_FTYPE = &sjis2ujis($M_FTYPE);
	$M_OWNER = &sjis2ujis($M_OWNER);
	$M_SUBJECT = &sjis2ujis($M_SUBJECT);
	$M_MAILFROM = &sjis2ujis($M_MAILFROM);
	if ($M_KANJI eq 'EUC') {
		$M_NAME = &sjis2ujis($M_NAME);
        }
	} elsif ($M_KCODE eq '') {
		if (($M_KANJI eq 'SJIS') && !($USER_AGENT =~ m/MSIE/)) {
			$M_NAME = &ujis2sjis($M_NAME);
		}
		if (($M_KANJI eq 'EUC') && ($USER_AGENT =~ m/MSIE/)) {
			$M_NAME = &sjis2ujis($M_NAME);
		}
}

$SEARCH = &secure_keyword($SEARCH);
ここの最後の方に「KCODE」が「UTF」だったらJcodeで検索語句を変換するという動作を追加。それだけ!(笑)
# code
if ($M_KCODE =~ m/SJIS/i)
	{ $SEARCH = &sjis2ujis($SEARCH);
	$M_HOST = &sjis2ujis($M_HOST);
	$M_FTYPE = &sjis2ujis($M_FTYPE);
	$M_OWNER = &sjis2ujis($M_OWNER);
	$M_SUBJECT = &sjis2ujis($M_SUBJECT);
	$M_MAILFROM = &sjis2ujis($M_MAILFROM);
	if ($M_KANJI eq 'EUC') {
		$M_NAME = &sjis2ujis($M_NAME);
        }
	} elsif ($M_KCODE eq '') {
		if (($M_KANJI eq 'SJIS') && !($USER_AGENT =~ m/MSIE/)) {
			$M_NAME = &ujis2sjis($M_NAME);
		}
		if (($M_KANJI eq 'EUC') && ($USER_AGENT =~ m/MSIE/)) {
			$M_NAME = &sjis2ujis($M_NAME);
		}
}

if ($M_KCODE eq 'UTF') {
	$SEARCH = Jcode->new($SEARCH,utf8)->h2z->euc;
}

$SEARCH = &secure_keyword($SEARCH);
最初手抜きをして「$SEARCH = Jcode->new($SEARCH)->h2z->euc;」と書いて上手く動いていたように見えたのだけれども、いざ社内で説明して「使ってみてください」と言ったら文字化けの嵐。Unicodeの自動判定がうまくいく単語、いかない単語があるようで(「検索」はOKだけど「変換」はダメとか)、きちんと「入力語はUnicodeです」と指定すると速度も上がり変換もきちんと行われるようなので指定しました。(きちんと文字コードを指定することに気づくのに3時間以上かかった…<アホです)

まぁこれだと「~」とかがUnicodeの関係で化けてしまうのですが、「~」などでは検索しないため問題はないと思います。

「~」が化けるという問題の対策は「~」を一旦「dhsajhdjka」などのあり得ない適当な文字列(英数字)に置き換えてJcodeを使ってEUCなどに変換し、その後「dhsajhdjka」を「~」に変換すればOKだと思います。まぁ結構ベタな方法かと。(メール送信は違う方法でやっていますけどね、それは機会があれば)

そんなわけでUTF8なページからも検索できるようになりましたとさ。あとはそのページにどの程度人を呼び込むかという根本的な問題が残っているんですけどね…。

カテゴリー:

このページをぜひシェアしてください