[netatalk-ja:0185] Re: Spotlightと日本語

HAT hat @ fa2.so-net.ne.jp
2013年 5月 3日 (金) 00:16:27 JST


HATです。

Wed, 24 Apr 2013 01:27:17 +0900, Hiroyuki Sato <hiroysato @ gmail.com>:
> まだ湯浅さんのところまで追いついておりません。
> 今しばらくお待ちください。

CentOS 6上でtrackerのインストールに成功したとしても、その手順は極めて
難解であり、情報を公開したところで社会的な貢献度は希薄だと思います。
やるだけ無駄じゃないでしょうか。
Spotlightの検討をするならば、trackerのパッケージが用意されているOS上で
行うべきでしょう。

それよりも、FPCatSearchで曖昧検索を実装するのはどうでしょうか。

ドイツ語の「ß」とASCIIの「ss」と同一視するテーブルはどれなのか
調べたところ、見つかりました。
http://www.unicode.org/Public/UNIDATA/CaseFolding.txt

00DF; F; 0073 0073; # LATIN SMALL LETTER SHARP S
1E9E; F; 0073 0073; # LATIN CAPITAL LETTER SHARP S

case foldingすればßやẞがssになります。
つまり、case foldingとNFKD化の両方をやってから文字列比較すれば
曖昧検索できます。

CentOS 6にはlibunistringパッケージがあるので、netatalkがこれを呼び出せば
いいんです。
http://www.gnu.org/software/libunistring/manual/libunistring.html

ズバリこの関数です。
uint16_t * u16_casefold (const uint16_t *s, size_t n, const char *iso639_language, uninorm_t nf, uint16_t *resultbuf, size_t *lengthp)

具体的には、
u16_casefold(文字列, 文字数, NULL, UNINORM_NFKD, resultbuf, lengthp)
としてやると、case foldしてからNFKD化した文字列がresultbufに入ります。

現在のnetatalkのFPCatSearchはetc/afpd/catsearch.c内で実装されており、
部分一致検索の場合、strcasestr_w()
完全一致検索の場合、strcasecmp_w()
を呼び出して比較しています。

この部分に手を加えて、文字列をu16_casefold()で変換してから、
部分一致検索の場合、strstr_w()
完全一致検索の場合、strcmp_w()
を呼び出して比較すれば、たぶん曖昧検索できます。

-- 
HAT


netatalk-ja メーリングリストの案内