検索ワードをUTF-8からEUC-JP変換してnamazu検索する

namazu.cgiはUTF-8の検索ワードに対応していないので、UTF-8ページの検索フォームからnamazu検索すると、検索ワードが文字化けしてしまい、正しく検索できない。http://www.namazu.org/FAQ.html#set-server-encoding に、namazu.cgiはUTF-8の入力に対応していないと記述がある。

次の案1と案2を作成した。案2はphp.iniでallow_url_fopen = Onの必要があり、必要条件の少ない案1を採用した。

案1: 検索フォームからnamazu.phpへ送信し、namazu.phpで検索ワードをUTF-8からEUC-JPに変換し、namazu.cgiへリダイレクトする。
案2: 検索フォームからnamazu.phpへ送信し、namazu.phpで検索ワードをUTF-8からEUC-JPに変換し、namazu.cgiへhttpリクエストし、内容を返す。

他に次のような記事もあった。試していないが、参考のため残しておく。

php用のnamazu.so拡張モジュールを使う。
・2013-02-14 RHEL6でnamazuをインストールしてPHPから使う
http://www.mogumagu.com/wp/wordpress/?p=1217
・2010-02-06 namazu.soの作り方
http://zkangaroo.blogspot.jp/2009/03/namazuso.html

formタグのaccept-charset指定、jsでdocument.charset指定。
・2009-01-12 UTF-8のページでnamazuを使う
http://blog.digital-assist.net/?p=21

以下、案1について説明する。

(1) namazu.phpに保存してください。

$path(赤太字)を本来のnamazu.cgi の設置パスに修正してください。

<?php
/*
namazu.php

■1.処理の流れ
(1) utf8ページから「ほげ」を検索
↓フォーム送信
(2) namazu.php?query=%E3%81%BB%E3%81%92&whence=0&max=20&result=normal&sort=score
↓リダイレクト
(3) namazu.cgi?query=%A4%DB%A4%B2&whence=0&max=20&result=normal&sort=score

■2.動作条件
(1) 5 <= PHP_VERSION(http_build_query関数があること)
(2) iconv拡張モジュールが有効であること。(通常はデフォルトで有効になっている)
*/
ini_set( 'display_errors', 1 );
ini_set( 'error_reporting', E_ALL );
ini_set( 'assert.bail', 1 );
assert( '5' <= PHP_VERSION );
assert( function_exists('iconv') );

if ( isset($_GET['query']) ) {
	$_GET['query'] = iconv( 'UTF-8', 'EUC-JP', $_GET['query'] );
}

$scheme = isset($_SERVER['HTTPS']) ? 'https' : 'http';
$host   = $_SERVER['HTTP_HOST'];
$path   = '/cgi-bin/namazu/namazu.cgi';
$query  = http_build_query($_GET);
$url    = sprintf( '%s://%s%s?%s', $scheme, $host, $path, $query );

header( "Location: $url" );
?>

(2) namazu.phpをサーバに設置してください。

動くならnamazu.cgiと同じディレクトリがわかりやすい。cgi-bin下でphpが動かない場合は、/namazu.php などに設置してください。

(3) utf-8ページの検索フォームのaction(赤太字)をnamazu.phpの設置パスに編集してください。

<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <title>namazu</title>
</head>
<body>
<h1>検索ボックス/UTF-8</h1>
<form method="get" action="/cgi-bin/namazu/namazu.php">
  <input type="text" name="query" />
  <input type="hidden" name="whence" value="0" />
  <input type="hidden" name="max" value="20" />
  <input type="hidden" name="result" value="normal" />
  <input type="hidden" name="sort" value="score" />
  <input type="submit" value="search" />
</form>
</body>
</html>