Namazu-devel-ja(旧)


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

半角カナを含む日本語ファイル名



竹迫です。

# namazu-devel-ja にも話題を振ります。

Subject: [namazu-win32-users-ja] Re: Namazu 2.0.5 for Win32パッチのまとめ
From: baba@xxxxxxxxxxxxxxxxxxxxxx <baba@xxxxxxxxxxxxxxxxxxxxxx> said:
> > ■備考
> >  ・半角カナを含む日本語ファイル名の場合、以下のエラーが出るケースが
> >   あるようです。
> >  ・半角カナの「フ ゜」(フ+半濁音)が「ブ」(フ+濁音)に変換されて
> >   いるようです。
>
>う、これは... パス名の半角カナ→全角カナ変換ルーチンのバグですね。
>
> >  ・半角カナのディレクトリ名やファイル名は扱えない。これらは全角カナ
> >   に変換されます。これはNamazuの仕様のようですね。
>
>まあ、いちおう「半角カナのフォルダ/ファイル名を作る方が悪い」とい
>うことになってますですね。正直な個人的な見解は「確かに至極まっとう
>だし、自分では絶対やらないから関係ないけど、そうは言ってもなあ、
>rare case じゃないから FAQになるのわかってるし、対応しないことによ
>るメリットってあんまりないんだから、対応すればいいのにな」というと
>ころですが、そうは言っても、これはあくまでポリシーの問題ですから。

なるほど、確かにこれはポリティカルな問題ですね。(^^;
私も馬場さんの意見に同感します。実際、すべてのエンドユーザに半角カナ
のフォルダ/ファイル名を作らないように徹底するのはとても難しい事です。
(場合によっては、半角カナは好んで使われることが多いようですし...)

ポリシーを優先するか、現実の問題を解決するのを優先するか?のどちらか
ですね。私の場合は、すべてのエンドユーザに半角カナのフォルダ/ファイ
ル名を使わないように徹底することが難しいと判断したので、このようなパ
ッチを作ってしまいました。

>当面の workaround としては、竹迫さんの namazu-users-ja 00849 のパッ
>チを当てるというので直るんじゃないかなとおもいます。試してませんが。
>なぜなら、pl/codeconv.pl はともかく、nmz/codeconv.c にパッチを当て
>ても再コンパイルする環境がないから。まあ、pl/codeconv.pl だけ当て
>てみて mknmz しなおしたら、なにやら namazu の出力結果が変わったか
>ら、たぶん直るとおもいます。

あと、pl/codeconv.pl と nmz/codeconv.c にパッチを導入した後に気づいた
んですが、mknmz.in に対してもパッチを当てる必要があるようです。それは
EUC-JP で文字が途中で切れないように文字列の末尾をカットしているところ
で、文字列に半角カナや補助漢字が含まれていると誤判定を起こしてしまう
場合があり得ます。

# もっとも、補助漢字なんて自分は使うことはありませんが...(^^;

↓パッチここから
--- mknmz.in Sun Jan 14 21:43:03 2001
+++ mknmz.in.kana Mon Jan 15 01:58:27 2001
@@ -633,9 +633,11 @@
 
     # -1 means "LF"
     my $summary = substr $tmp, 0, $conf::MAX_FIELD_LENGTH - 1;
-    my $kanji = $summary =~ tr/\xa1-\xfe/\xa1-\xfe/;
-    # Remove a garbage Kanji 1st char at the end.
-    chop($summary) if $kanji %2;
+    # Remove a garbage Kanji 1st or 2nd char at the end.
+    if ($summary =~ /\x8f$/ or $output =~ tr/\x8e\xa1-\xfe// % 2) {
+ chop($summary);
+ chop($summary) if ($output =~ /\x8f$/);
+    }
 
     $summary =~ s/^\s+//;
     $summary =~ s/\s+/ /g;   # normalize white spaces
@@ -680,9 +682,11 @@
 
      # -1 means "LF"
      $output = substr $output, 0, $conf::MAX_FIELD_LENGTH - 1;
-     my $kanji = $output =~ tr/\xa1-\xfe/\xa1-\xfe/;
-     # Remove a garbage Kanji 1st char at the end.
-     chop($output) if $kanji %2;
+     # Remove a garbage Kanji 1st or 2nd char at the end.
+     if ($output =~ /\x8f$/ or $output =~ tr/\x8e\xa1-\xfe// % 2) {
+  chop($output);
+  chop($output) if ($output =~ /\x8f$/);
+     }
 
      $output .= "\n";
  } else {

↑パッチここまで

【アルゴリズムの説明】

EUC-JP で文字が途切れる可能性があるのは、3バイトで表現される補助漢字
(JIS X 0212)と、2バイトで表現される全角文字(JIS X 0208)と、半角カナ
(JIS X 0201片仮名)で、$output =~ /\x8f$/ という条件で、文字列末尾に
補助漢字の 1バイト目が来ていることがわかるので、1回だけ chop します。
そして、 $output =~ tr/\x8e\xa1-\xfe// % 2 の条件では、半角カナと
全角文字の 1バイト目と 2バイト目、補助漢字の 2バイト目と 3バイト目の
数を数えており、もしもこの数が奇数ならば文字が途切れていることがわか
りますので、1回 chop し、さらに文字列末尾に補助漢字の 1バイト目が来て
いるかどうかを調べて、そうであればもう 1回 chop します。

# $summary についても同じです。

># このパッチをマージするかどうかは... namazu-devel-ja の話題かな。
># マージしていいとおもうんだけどなー。

とりあえず、今までのパッチを以下のURLにまとめました。

・JIS X 0201片仮名&JIS X 0212補助漢字対応パッチ
  http://www.namazu.org/~takesako/pub/kana-patch.tar.gz

他のみなさんの御意見もお伺いしたいところです。
ちなみに、こちらではうまく動いているようです。

以上、よろしくお願いいたします。

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