Namazu-users-ja(旧)


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

encoding for filename



竹迫です。

# 最近 Namazu を使い始めたもので、既知の問題でしたらすみません。

Osamu Okano <osamu2001@xxxxxxxxxxxx> said:
>具体的には
>mknmz --replace="s/c:\//file:\/\/\/c:\//;" -U
>みたいなやり方で解決できると思います。

アドバイスありがとうございます。
mknmz -U とする方法も試してみましたが、Namazu 2.0.4 for Win32 では
以下の問題点があったため、以下の解決策を考えていました。

▼ mknmz -U の問題点
1. パス名やファイル名に半角カナを使用していると全角カナに変換される
2. IE5 のデフォルトの設定ではURL中の日本語コードがUTF-8で送信される
3. -U オプションを外すと、EUC-JPに変換されてからURIエスケープされる

▼ 考えられる解決策
1. ./pl/codeconv.pl の shiftjis_to_eucjp() で半角カナを保存する
2. Web Server を IIS 5.0 (Windows2000) にするとUTF-8でも大丈夫
3. mknmz にパッチを当て、ShiftJIS のままでURIエスケープする
4. 日本語や半角カナのファイル名を使用しないようユーザに指導する

解決策 1 について、以下の2つのサブルーチンを置き換えて試してみました。
# 実装にあたっては jcode.pl,v 2.11 を参考にしました。

----  ここから ----
# convert Shift_JIS to EUC-JP
sub stoe($) {
    my ($c1, $c2, $code);
    ($c1, $c2) = unpack('CC', $code = shift);

    if (0xa1 <= $c1 && $c1 <= 0xdf) {
        $c2 = $c1;
        $c1 = 0x8e;
    } elsif (0x9f <= $c2) {
        $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe0 : 0x60);
        $c2 += 2;
    } else {
        $c1 = $c1 * 2 - ($c1 >= 0xe0 ? 0xe1 : 0x61);
        $c2 += 0x60 + ($c2 < 0x7f);
    }
    pack('CC', $c1, $c2);
}

sub shiftjis_to_eucjp($) {
    my ($str) = @_;
    if (util::islang("ja")) {
        $str =~ s/([\201-\237\340-\374][\100-\176\200-\374]|[\241-\337])/&stoe($1)/geo;
    }
    $str;
}
---- ここまで ----

このようにすることによって、インデックスに書き込まれる
NMZ.field.uri の中では、半角カナ(EUC-JP)が保存されました。
しかし、namazu で使用している ./nmz/codeconv.c 中の関数
static void euctosjis(uchar *s) は、2バイト文字である
JIS X 0201片仮名(EUC-JP の半角カナ) を考慮していないためか、
ShiftJIS の半角カナに変換できずに文字化けしてしまいました。

例)C:\WINDOWS\デスクトップ(半角カナ)\テスト.doc
  検索結果 → /C|/WINDOWS/偲酌漆失柴識捨釈/テスト.doc

この問題を解決するには codeconv.c の修正が必要だと思われます。

とりあえず現状では解決策3にて運用しています。

--
   広島市立大学 情報科学部 情報機械システム工学科
     竹迫 良範 <takesako@xxxxxxxxx>