UTF-8 への対応では、検索側の utf-8 への対応について述べた、 一方、前処理側のほうは、特段の対応は不要であった。というのは、 内部に nkf モジュールがあり、このモジュールが自動的に入力のコードを判別し、 EUC に変換していたからだ。
ところが、nkf で救いきれない文字群があった。それは、ASCII 7 bit 英数字でもなく、 EUC で表現できる日本語文字でもない文字である。 その多くをダイアクリティカルマーク付き文字が占める。 ダイアクリティカルとは発音が区別されるべき文字に付される記号であり、 具体的にはアクセントやウムラウトが該当する。 したがって、ダイアクリティカルマーク付き文字(記号)は、 アクセント付き文字(記号)とかウムラウト付き文字(記号)というように呼ばれることが多い。
フランスの作曲家、ガブリエル・フォーレ ( Gabriel Fauré ) には、e の字にアクセント、 正確には鋭いアクセント(アクサン・テギュ)がつけられた é の字がつけられている。 この é の字を Namazu では検索文字に含めることができない。これは Namazu の仕様である。
ではせめて、検索結果の表示に出るタイトルだけでも、é の字を出すことはできないか。 一つ考えたのは、インデックスのうち NMZ.field.subject を Namazu とは別に作る方法である。 これはできそうではあるが、nkf は使えない。というのは、nkf は、utf-8 を EUC に変換するときに、 é の字を落としてしまうからだ。
したがって、nkf は使わず、代わりに iconv を使うことにした。 iconv は入力テキストから文字コードを推定する機能はないので、明示的に入力ファイルの文字コードを指定する。 今回は次のようにして確認した。
$ iconv -f UTF-8 -t EUCJP-MS utf8file > eucfile
-f は入力文字コードを、-t は出力文字コードを表す。-t に EUCJP ではなく EUCJP-MS を指定したのは、 たつ崎(﨑)や、はしご高(髙)の字も変換できるようにするためだ。
crontab で、rffiedls.sh INDEXDIR のように記述しておく。
#!/bin/sh # rffields.sh : タイトルフィールドの変換と再フォーマット IDX=$1 export IDX echo $IDX /bin/cp $IDX/NMZ.field.subject $IDX/NMZ.field.subject.orig LANG=ja_JP.UTF-8 export LANG LC_ALL=ja_JP.UTF-8 export LC_ALL /bin/cat $IDX/NMZ.field.uri | /usr/bin/xargs /usr/local/bin/ruby -0777 -ne 'puts gsub(/.*<title.*?>(.*?)<\/title>.*/mi,"\\1").strip.gsub(/\s+/," ")' > $IDX/NMZ.field.subject.utf8 /usr/bin/iconv -f UTF-8 -t EUCJP-MS $IDX/NMZ.field.subject.utf8 > $IDX/NMZ.field.subject.euc /bin/cp $IDX/NMZ.field.subject.euc $IDX/NMZ.field.subject LANG=ja_JP.EUC export LANG LC_ALL=ja_JP.eucJP export LC_ALL /usr/local/bin/rfnmz $IDX
まず、最初の /bin/cp では、Namazu により作成されたオリジナルの NMZ.field.subject ファイルを NMZ.field.subject.orig として保管しておく。
次に、環境変数 LANG と LC_ALL をともに utf-8 用に設定する。これは、 Namazu ではこれらが EUC であることを前提として作成されているので、この影響を打ち消すための処理である。 これをしないと、次の /bin/cat で始まるコマンドで失敗する。
/bin/cat で始まるコマンドが変換の要である。ここではまず、$IDX/NMZ.field.uri を cat で表示させて、
対象となるファイルすべてを列挙する。これをパイプにかけて、xargs に流し込むとともに、
ruby のコマンドに通し、タイトルの内容を抽出する。この内容をリダイレクトして、
$IDX/NMZ.field.subject.utf8 という名前で格納する。
環境変数を変えておかないと、この ruby を実行するときに、
`gsub': invalid byte sequence in EUC-JP (ArgumentError)
のようなエラーで失敗する。
/usr/bin/iconv では、utf-8 で記述された $IDX/NMZ.field.subject.utf8 から EUC で記述された $IDX/NMZ.field.subject.euc を作成する。iconv を使うことによって、 nkf で作成されたオリジナルの NMZ.field.subject では切り捨てられた外国語のアクセント付き記号が、 切り捨てられずに保存されている。
次の /bin/cp は、変更後の EUC で記述された NMZ.field.subject.eucで NMZ.field.subject を置き換える。 何らかの事情でこの変換が失敗すれば、NMZ.field.subject.orig でリストアする。
最後に環境変数 LC_ALL と LANG を Namazu 用の EUC に戻したうえで、 rfnmz を実行する。rfnmz も Namazu の一連のコマンドで、NMZ.field.* を変更したあとは、 整合性をとるために必ず rfnmz を実行する必要がある。
なお、ruby のワンライナーはリンク先を参照のこと。
まりんきょ学問所 > 全文検索システム Namazu > アクセント付き記号の処理