KENT-WEB サポートコーナー 過去ログ [ 0098 ]


記事No: 16005
投稿日: 2018/09/20(Thu) 17:04:47
タイトルKey Search 文字化け
ID情報: 7502
投稿者: 松尾
URLkatsuzumi@yahoo.co.jp

KENTさま

Key Searchを社内LAN上で使用させていただきたくダウンロードさせていただきました。

ありがとうございます。

見ためシンプルで動作も早くとても良いのですが、インデックスを作成するときにファイル名(漢字+半角数字)が文字化けしてしまいます。

検索対象はテキスト(.txt)です。

ファイルの中身も漢字なのですがこちらは文字化けしませんのでファイル名が半角英数字で中身が漢字のファイルは正常にインデックス化+検索ができます。

ディレクトリー構成はサンプルの通りにしております。

お忙しいところ申し訳ありませんが設定等で確認する点がありましたらご教示よろしくお願い致します。


記事No: 16006
投稿日: 2018/09/21(Fri) 09:28:44
タイトルRe: Key Search 文字化け
ID情報: teketen
投稿者: てけてん

申し訳ないのですが、KENTさんは、ここ何年かは、殆どサポート掲示板で返信されていません。
年に1〜2回書き込みされるだけでしたが、最近来られたのは、去年の7月30日の投稿が最後ですね。。
なので、KENTさんではないのですが、私でよろしければ、以下の修正をしてみてくだい。

Key Searchは、全角文字のファイルに対応していません。
ですので、全角文字などをURLデコードして対応します。

admin.cgi
207行目付近

# 対象をパス付で定義
my $dir = "$in{dir}/$_";
my $pat = "/$_";



# 対象をパス付で定義
my $dir = "$in{dir}/$_";

# 改造のため追加 ■■
my $decode = $_;
if($decode=~ /[^\w\.\~\-\/\?\&\#\+\=\:\;\@\%]+/ and -f $dir) {
$decode =~ s/([^\w\. ])/'%'.unpack('H2',$1)/eg;
$decode =~ tr/ /+/;
}
my $pat = "/$decode";# 改造のため修正 ■■

に変更して下さい。
表示されるアドレスはデコード後のものですが、対象ファイルにアクセスすることが出来ます。


記事No: 16007
投稿日: 2018/09/21(Fri) 09:54:14
タイトルRe^2: Key Search 文字化け
ID情報: 7502
投稿者: 松尾
URLkatsuzumi@yahoo.co.jp

てけてんさま

早速ご教示いただきありがとうございます。

変更してやってみましたがだめでした。

ファイル名 テスト1ファイル名.txt
内容    テスト1ファイル中身

をインデックスして「テスト」で検索してみると


検索文 [検索方法]
条件: ANDOR 件数: 10件20件30件40件50件 ソート: 新しい順古い順
検索結果
キーワードにマッチする1個の文書が見つかりました。

1. 無題
日付 : 2018/09/21(Fri) 09:44:59
テスト1ファイル中身
//ns57/ksearch/test/�e�X�g�P�t�@�C����.txt
リスト : 1 - 1件
Page :

となり、対象ファイル名が化けたままでした。

お時間があり他に何かあるようでしたらご教示お願い致します。

松尾



> 申し訳ないのですが、KENTさんは、ここ何年かは、殆どサポート掲示板で返信されていません。
> 年に1〜2回書き込みされるだけでしたが、最近来られたのは、去年の7月30日の投稿が最後ですね。。
> なので、KENTさんではないのですが、私でよろしければ、以下の修正をしてみてくだい。
>
> Key Searchは、全角文字のファイルに対応していません。
> ですので、全角文字などをURLデコードして対応します。
>
> admin.cgi
> 207行目付近
>
> # 対象をパス付で定義
> my $dir = "$in{dir}/$_";
> my $pat = "/$_";
>
> を
>
> # 対象をパス付で定義
> my $dir = "$in{dir}/$_";
>
> # 改造のため追加 ■■
> my $decode = $_;
> if($decode=~ /[^\w\.\~\-\/\?\&\#\+\=\:\;\@\%]+/ and -f $dir) {
> $decode =~ s/([^\w\. ])/'%'.unpack('H2',$1)/eg;
> $decode =~ tr/ /+/;
> }
> my $pat = "/$decode";# 改造のため修正 ■■
>
> に変更して下さい。
> 表示されるアドレスはデコード後のものですが、対象ファイルにアクセスすることが出来ます。


記事No: 16008
投稿日: 2018/09/21(Fri) 10:43:31
タイトルRe^3: Key Search 文字化け
ID情報: teketen
投稿者: てけてん

そうですか。

ちゃんと管理ページで、インディックスを作成し直されていると思うので、私の環境では問題なかったので、何が原因なのかちょっとよくわかりません。
では、も一つの方法をとります。
スクリプトもindex.datも文字コードがEUCなので、ファイル名をindex.datに保存する際に、EUCに変換します。
最初からこちらをご案内出来れば良かったのですが、今思いついたもので…。

先程修正した場所をもう一度見て下さい。

その部分で
$decode =~ s/([^\w\. ])/'%'.unpack('H2',$1)/eg;
$decode =~ tr/ /+/;

があると思うので、その部分を

$decode = $j->set($decode)->euc;

に変更して下さい。

そして、管理ページで、もう一度インディックスを作成し直して下さい。

# 申し訳ありませんが、私の前文を全文引用しないで下さい。
# 引用される時は、必要な部分のみ、引用して下さい。
# お願いいたします。


記事No: 16009
投稿日: 2018/09/21(Fri) 11:45:38
タイトルRe^4: Key Search 文字化け
ID情報: 7502
投稿者: 松尾
URLkatsuzumi@yahoo.co.jp

てけてんさま

修正してみましたが同じでした。

てけてんさまの環境では問題無かったとの事ですので当方環境に問題があるのかと思います。

はずかしながらそこを調査する技量が当方ありませんので、若干使い勝手は下がりますが被検索ファイル名を半角数字だけとすることでKey Seaechを使用させていただこうと思います。

貴重なお時間ありがとうございました。

松尾


記事No: 16010
投稿日: 2018/09/21(Fri) 12:38:11
タイトルRe^5: Key Search 文字化け
ID情報: teketen
投稿者: てけてん

なるほど、そうですか。

もう、見ていらっしゃらないかも知れませんが、index.datを手動で書き直すとう手もあります。
ただ、数が多いと大変ですけれど。
もしも手動で変更されるなら、index.datはeucで保存して下さい。

ただ、もう一度確かめてほしいのに、index.datの文字化けは、
$decode = $j->set($decode)->euc;
に変更しても
�e�X�g�P�t�@�C����.txt
のように、&#数字の形式ですよね?
なら、

$decode = $j->set($decode)->euc;

の記述の前の行又は、次の行(これは、どちらかで確かめて下さい)に

$decode =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

を記述すると良いかも知れません。


記事No: 16011
投稿日: 2018/09/21(Fri) 13:37:28
タイトルRe^6: Key Search 文字化け
ID情報: 7502
投稿者: 松尾
URLkatsuzumi@yahoo.co.jp

>�e�X�g�P�t�@&#655>33;C����.txt
> のように、&#数字の形式ですよね?


てけてんさま

申し訳ございません。

文字の化け方は&#数字の形式ではなく

□e□X□g□P□t@C□□□□.txt

です。

検索結果画面の文字をコピーして貼り付けたのですが&#数字に化け

てしまったみたいです。

対処方法が異なりますでしょうか。

松尾


記事No: 16012
投稿日: 2018/09/21(Fri) 16:37:31
タイトルRe^7: Key Search 文字化け
ID情報: teketen
投稿者: てけてん

> 文字の化け方は&#数字の形式ではなく
>
> □e□X□g□P□t@C□□□□.txt
>
> です。

なるほど。
私も改造前は同じでした。
ということは、ファイル名の文字コードがShift_jisなので、

$decode = $j->set($decode)->euc;

と文字コードを変更すれば、良いはずなのですが、それが出来ていないようですね。
う〜ん、何ででしょうね。
ファイルの中身の文字コードの変換は、ちゃんと出来ているんですよね…。
ファイルの中身の文字コードは、何でしょうか?

> 対処方法が異なりますでしょうか。

ええ、

$decode =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg;

は必要ないですね。
改造のために追加した部分は、

# 改造のため追加 ■■
my $decode = $_;
if($decode=~ /[^\w\.\~\-\/\?\&\#\+\=\:\;\@\%]+/ and -f $dir) {
$decode = $j->set($decode)->euc;
}
my $pat = "/$decode";# 改造のため修正 ■■

となります。
(勿論、
my $dir = "$in{dir}/$_";
の部分はそのままで)
取り敢えず、ファイルの中身の文字コードと、Perlのバージョンを教えて下さい。


記事No: 16013
投稿日: 2018/09/23(Sun) 11:46:40
タイトルRe^8: Key Search 文字化け
ID情報: 7502
投稿者: 松尾
URLkatsuzumi@yahoo.co.jp

てけてんさま

引き続きありがとうございます。

> 取り敢えず、ファイルの中身の文字コードと、Perlのバージョンを教えて下さい。

SHIFT-JIS
V5.16.3

です。


記事No: 16014
投稿日: 2018/09/24(Mon) 10:51:22
タイトルRe^9: Key Search 文字化け
ID情報: teketen
投稿者: てけてん

Perlのバージョンが5.6と古い場合は、KENTさんが同封されているJcode.pmと相性が悪い場合があります。
同じように、別のバージョンでも、相性が悪い場合があるのかも知れません。
ということで、以下の改造の前に、今までの改造で試してほしいものがあります。
サーバーにJcode.pmがインストールされている場合は、Key Searchのlibディレクトリに格納されているJcode.pmとJcodeディレクトリを削除して、文字化けするか確かめて見て下さい。
これでも駄目な場合は、以下の改造をします。

Shift_jisで検索対象のファイル名とファイルの中身を読み取り、ログに保存する時にEUCに変換してみましょうか。

admin.cgiの207行目付近の改造を元に戻して下さい。
又は、もう一度スクリプトをダウンロードして、admin.cgiのみを差し替えて下さい。

その上で、以下の改造をして下さい。
403行目付近

# コード変換
$html = $j->set($html)->euc;

# タイトル取得
$html =~ m|<title>(.+)</title>|si;
my $ttl = $1 || '無題';



# コード変換
$html = $j->set($html)->sjis; # 修正 ■■

# タイトル取得
$html =~ m|<title>(.+)</title>|si;
my $ttl = $1 || $j->set('無題')->sjis; # 修正 ■■

に変更。

$html = $j->set($html)->euc;

の部分ですが、もしも、検索対象のファイルの中身が全てShift_jisならば、

# $html = $j->set($html)->euc;

とコメントアウトしても構いません。
他の文字コードが混じっている場合は、

$html = $j->set($html)->sjis; # 修正 ■■

に変更します。

257行目付近

# 新規追加分
foreach ( keys %new ) {
$new++;
print OUT $new{$_};
}




# 新規追加分
foreach ( keys %new ) {
$new++;
$new{$_} = $j->set($new{$_})->euc; # 追加 ■■
print OUT $new{$_};
}

に、241行目付近

# 既存あり且つ更新あり(差し替え)
} elsif (defined($chg{$page})) {
$chg++;
print OUT $chg{$page};



# 既存あり且つ更新あり(差し替え)
} elsif (defined($chg{$page})) {
$chg++;
$chg{$page} = $j->set($chg{$page})->euc; # 追加 ■■
print OUT $chg{$page};

に変更して下さい(# 追加 ■■とある行を挿入する)。
これで駄目なら、Encode.pmで変換してみると良いかも知れませんが…取り敢えず、上記方法を試して下さい。


[検索ページ]