14.5. 文字セット

14.5.1. UTF-8 およびシングルバイト文字セットのサポート

Zend_Search_Lucene は、UTF-8 文字セットで動作するように設計されています。 インデックスファイルには、unicode のデータが Java の "modified UTF-8 encoding" で保存されます。 Zend_Search_Lucene はこの文字セットを完全にサポートしていますが、 ひとつだけ例外があります。 [7]

しかし、テキスト解析器およびクエリパーサは、 テキストやクエリをトークン化する際に ctype_alpha() を使用しています。ctype_alpha() は UTF-8 をサポートしていません。この処理は近いうちに書き直す必要があります。

それまでの間は、データを ASCII 表現に変換しておくことを強く推奨します [8] (ソースドキュメントの保存時と検索時の両方とも)。

<?php
$doc = new Zend_Search_Lucene_Document();
...
$docText = iconv('ISO-8859-1', 'ASCII//TRANSLIT', $docText);
$doc->addField(Zend_Search_Lucene_Field::UnStored('contents', $docText));

...

$query = iconv('', 'ASCII//TRANSLIT', $query);
$hits = $index->find($query);
?>


[7] Zend_Search_Lucene では Basic Multilingual Plane (BMP) 文字 (0x0000 から 0xFFFF まで) のみをサポートしており、 "supplementary characters" (コードポイントが 0xFFFF より大きい文字) はサポートしていません。

Java 2 では、これらを文字 (16 ビット) のペアで表します。最初の文字が上位サロゲート (0xD800-0xDBFF)、 2 番目の文字が下位サロゲート (0xDC00-0xDFFF) となります。 その後、これらが 6 バイトの UTF-8 文字にエンコードされます。 標準的な UTF-8 では、supplementary characters を 4 バイトで表します。

[8] もしデータに非 ASCII 文字が含まれていたり UTF-8 だったりした場合