ラウンジ(兼FAQ掲示板)

Site_Search v.1.0 の検索結果が文字化け
過去ログ NO.1136536939
□ 蔵人 [2006年01月04日07時55分]
はじめまして。サイト内検索のできるスクリプトを探していて、こちらのSite_Search v.1.0
が理想的なものでしたので、設置させていただきました。

設置後、稼働はするのですが、漢字一文字で検索した場合、ときどき検索結果一覧の一部分が文字化けしてしまうことに気がつきました。
検索語句によって、同じファイルが文字化けをしたり、しなかったりするようです。

例えば、「海」とか「娘」などの語句で検索すると文字化けをおこし「人」とか「狐」「狸」などでは文字化けしません(昔話系サイトなので、こういう語句が多いのです)。
他にもいろいろ試してみましたが、どんな規則性があるかわかりませんでした。
検索結果で文字化けしているファイルでも、そこからページタイトルをクリックして表示したものは文字化けしていません。

設置したのは以下のURLです。

http://mannichi.hp.infoseek.co.jp/cgi-bin/search/kensaku.cgi
(上のURLをクリックしても403 Forbiddenとなると思います。アドレスバーにコピー&ペーストして下さい)

スクリプトをテキストとして見られるようにしました。

http://www.hp.infoseek.co.jp/m/a/n/mannichi/cgi-bin/search/kensaku.txt

cgi-binの中にjcode.plとsearchディレクトリを作成して、searchディレクトリの中にsite_search.cgiをkensaku.cgiと名前を変えて置いてあります。
検索対象ディレクトリは
http://mannichi.hp.infoseek.co.jp/episode/ 以下を指定しています。
スクリプトはレイアウト部分は手を入れていますが、表示されるものを非表示にする変更程度で、スクリプト自体の修正はしていません。
検索対象ファイルはすべてshtmlで、Shift-jisで作成しています。

もし、この症状にお心当たりがあり、解決する方法をご存じの方がいらっしゃいましたら、教えていただきたいと思います。どうかよろしくお願いします。
□ 上記書き込みの訂正です [2006年01月04日08時05分]
> スクリプトをテキストとして見られるようにしました。
> http://www.hp.infoseek.co.jp/m/a/n/mannichi/cgi-bin/search/kensaku.txt

上記URLでは表示できないようでしたので、こちらからお願いします。
http://mannichi.hp.infoseek.co.jp/kensaku.txt

では、よろしくお願いします。
□ NXer [2006年01月04日22時51分]

あけましておめでとうございます。NXです。
下記愚案で試行のほど宜しくお願いします。

>どんな規則性

私たちがコンピュータで使う日本語は、実はとても複雑です。英語ではアルファベットと
数字、それに記号を1バイト系のコードで表すことができます。日本語は
Shift-JIS、EUCの文字コードがありますが、ともに2バイト系です。
おおくのcgiはShift-JISベースですが、5Cを含む漢字などが文字化けします。
しかし、site_searchの問題は、文字コードの正規表現の問題です。

site_search.cgiの次の行を見てください。eucコードに変換されています。
■-----------------------------------------原作
127 &jcode'convert(*value,'euc');
180 &jcode'convert(*file_val,'euc');
□------------------------------------------
127 &jcode'convert(*value,'sjis');
180 &jcode'convert(*file_val,'sjis');
--------------------------------------------
下段のように(↑のように)直してください。これでShift-JISで

1 検索語
2 検索対象ファイル

を調べることができます。

日本語が混じっている文(文字列)を、すえぽんさんはeucコードで
1文字ずつ処理されています。次の206、217行 #です。
perlの正規表現で、sjisコードが一致するかを調べる16進数に変更
しています。
----------------------------------------上の行が元、下sjis対応
206 # if ($string =~ /[\x80-\xff]/) { $string = substr($file_val,$pos1+$_,2); $pos1++; }
206 if ($string =~ /[\x00-\x7f]/) { $string = substr($file_val,$pos1+$_,2); $pos1++; }

217 # if ($string =~ /[\x80-\xff]/) { $string = substr($file_val,$pos2-$_-2,2); $pos2--; }
217 if ($string =~ /[\x00-\x7f]/) { $string = substr($file_val,$pos2-$_-2,2); $pos2--; }
--------------------------------------------------------------------------

変更したsite_searchの検索結果です。検索語は「海」です。
--------------------------------------------------
検索範囲:http://127.0.0.1/~nxer/ 以下
検索対象:全140ディレクトリ 1252ファイル中 340ファイル(html htm txt)
表示件数:10件/ページ
検索キー:海
全ての検索キーにマッチするページ数: 11ページ(内11→11を表示)
(1〜9省略)

10. タイトル無し update:2006/01/04,17:40:03 size:553b
02/06/0715:22山の中にどんな病気も。してしまう池があってその水を持ち帰った若メがいてタはその水は酒だった・・・っていう話なかったっけ?養老の滝とかいう題名じゃなかった?なんかゴッチャになってそうだな。23.海女と大あわび海女と大あわび【懐かしい】アニメ日本昔話はオカルト満載【語れ】(オカルト)440名前:431/投稿日:02/07/2016:28逢瀬をむさ...

http://127.0.0.1/~nxer/mojibaketest/yourou.txt

11. 養老の滝 文字化けデータsjis update:2006/01/04,21:24:08 size:958b
02/06/0715:22山の中にどんな病気も。してしまう池があってその水を持ち帰った若メがいてタはその水は酒だった・・・っていう話なかったっけ?養老の滝とかいう題名じゃなかった?なんかゴッチャになってそうだな。23.海女と大あわび海女と大あわび【懐かしい】アニメ日本昔話はオカルト満載【語れ】(オカルト)440名前:431/投稿日:02/07/2016:28逢瀬をむさ...

http://127.0.0.1/~nxer/mojibaketest/youro_waterfall.html
---------------------------------------------------------------------
10 はそちらのデータをテキストファイルで保存したもの。
11 は、HP作成ソフトでタイトルを付けてウェブページにしたもの。
127、、、のURLは、当方のローカルサーバ。

参考文献
杜甫々、CGI&Perl 究極のレシピ350、技術評論者、2003、p.86

>昔話系サイト
高齢化社会ですがまだまだ全国には、お一人でたくさん昔話を語ることが
できる方はご健在と思います。お話を収録してウェブサイトで聴けるよう
にしていただけるといいですね。すえぽんさんのweb_juke.cgiは音楽ファイル
(midi,mp3)を配信できますが、それを転用して3〜5分程度の音声ファイルが
聴けると何倍も貴サイトが楽しめそうです。何倍とは、話し手と聴き手
の子どもたち分という意味です。初夢を楽しませていただきました。

□ 蔵人 [2006年01月05日15時22分]
NXさん、はじめまして。
大変ご丁寧でわかりやすいお返事ありがとうございます。
さっそく教えていただいた箇所を修正しました。
その結果、「海」や「娘」などの文字化けはしなくなりましたが、それでも特定の漢字を入力すると、特定の文字に化けてしまいます。
気がついたところであげますと、者→メ、自→ゥ、狢→狎、狎→狆などです。
修正前のプログラムでも同じようになるのを確認しました。確認できるよう、両方掲載しておきます。

修正前
http://mannichi.hp.infoseek.co.jp/cgi-bin/search/kensaku_euc.cgi
修正後
http://mannichi.hp.infoseek.co.jp/cgi-bin/search/kensaku.cgi
(アドレスバーにコピー&ペーストして下さい)

こちらにおかれているサンプルでも同じ現象になるので、諦めるしかないのでしょうか。

あと、これは偶然発見したのですが、検索キーに「骸骨」と入れると「CGIエラー」となってしまいます(呪いでしょうか?)。
この現象は修正前のスクリプトではおきません。どうやら「骸」の文字が原因になっているようです。

重ね重ねで申し訳ありませんが、ご教示いただけると嬉しいです。
□ NXer [2006年01月06日12時45分]

いくつか障害となる漢字を知らせていただきありがとうございます。
NXerです。

cgiは、perlという言語で実行されています。このスクリプト言語では
英語数字以外に記号を使います。例えば、¥記号(文字)は16進数では
5Cで表記されます。データとして漢字が使われる時、漢字を構成する2
バイト文字の上位と下位いずれかにこの記号が入っていると、実行し
た時、perlは、漢字と「感じない」でperlの文字、メタ文字と感知します。

たとえば、sjisでは文字化けで有名な「表」ですが、95・5cです。
"表示"と入力フォームに入れると、perlは文法エラーになります。
そこで、入力フォームに表\示と入力すればエラーは回避できます。
次は、表示と入力して自動的に表\示と処理するものです。
-----------------------------------------
129 # 5c/\の処理  表示→表\示 メタ文字を含むsjis対応
130 $value =~ s/\\/\\\\/g;
---------------------------------------------
131 $value =~ s/\[/\\\[/g;
--------------------------------------------
~ s/A/B/の形式でAをBに置換します。130行は\を\\に置き換えると
いうことです。二つある\の前の\はエスケープ記号で後の\を本来の文字と
みなします。
さてこれを利用して、見かけ上は呪われた「骸」を処理します。8a5b
の下位1バイト5bが [ 記号です。131行目です。これで少なくともエラーは
回避できました。
ただし検索語の入力では、骸骨ですが、検索キーでは浬[骨となります。
しかし、検索実例のように本文の前後文中では正しく骸骨です。

>者→メ、自→ゥ、狢→狎、狎→狆
これは、次の2行を見てください。前回sjisベースにしたことから
これでsjisになっていると思い込んでいました。
ただしくは、すでにsjisにしたファイルを実はeuc扱いしてさらに
sjisにするということから、sjisの2バイト中、上位が(8E)で
下位が例えば(5B、5C)のようにperlのメタ文字(\、[,],$,など)
の場合や半角仮名がその影響を受けているようです。者がメと
なっています。

そこで解決策は、次の2行を削除するか、または、コメント文と
して#記号を文頭につけて残しておきます。
------------------------------------------------
233 # &jcode'convert(*inf,'sjis','euc');
250 # &jcode'convert(*keys,'sjis','euc');
-----------------------------------------------

下記駄作を「若者」で検索した結果:
---------------------------------------------------
1. タイトル無し update:2006/01/06,12:01:56 size:518b
--骸骨--ある夜、一人の若者がひそかに土蔵の奥深くに隠されていたコンピュータを発見したとな。昔話の一つもディスクに残っていないかと検索語に骸骨といれたら、プログラムはそれで消滅したそうな・..
-------------------------------------
「骸骨」の結果
--------------------------------------
. タイトル無し update:2006/01/06,12:01:56 size:518b
B-骸骨--ある夜、一人の若者がひそかに土蔵の奥深くに隠されていたコンピュータを発見したとな。昔話の一つもディスクに残っていないかと検索語に骸骨といれたら、プログ・..
-----------------------------------------

得た結論と愚考
「若者」では題名は正しく反映。しかし、「骸骨」では
検索欄入力でエラーを回避する置換処理はできたが、原作の
すえぽんさんのスクリプトでは、ファイルの初めのところで
「骸」の下位1バイトのBだけが処理されずに残っているのかも。
perlが原則1バイト文字処理のために、正規表現で日本語の2バイ
トには「正確にはマッチしない」(銀座企画、Perl/CGIハンドブッ
ク、秀和システム、2001)こともあるそうです。おそらく解決策は
あると思いますが、これにて終結させていただきます。

初春早々呪いに呪われて、鬼退治ついでに愚作を思いつき検索を
満喫させていただきました(苦笑)。
スクリプトをテストされます時は、くれぐれもコンピュータの暴走
には気をつけてください。できればローカルサーバでお願いします。
プロバイダーのサーバで直接試すことは自信があってもかなり危険
です~ s/A/B/g;で、\メタ文字の使い方を誤ると無限ループに入る恐れ
があります。

なお、この無限ループを使う昔話のパターンはこどもを寝かせつける
のには有効です。森に大きな木がありました。その実が一つ落ちました。
その実から芽が出て、木になり、森をつくり、また木の実が一つ、、、∞

--------------------------sjis検索用創作nxer
--骸骨--

ある夜、一人の若者がひそかに土蔵の奥深くに隠さ
れていたコンピュータを発見したとな。昔話の一つ
もディスクに残っていないかと検索語に骸骨といれ
たら、プログラムはそれで消滅したそうな。
言い伝えではそのプログラムに埋め込まれた暗号が
海に浮かぶ小島にある宝物殿の鍵の暗証コードだっ
たとか。島には狆(ちん)や狢(むじな)が生息し
ており人は近づかなかったとか。
その若者は、狸のように人をだましていたが、自分
はコンピュータにだまさたと思い、とうとうその土
蔵のなかでなくなり、いまは骸骨だけが残っとるとな。
----------------------------------------------
□ 蔵人 [2006年01月06日17時35分]
NXerさん、重ね重ねありがとうございました。
修正したところ改善が見られました。まだ一部おかしいところがあるのですが、以前に比べれば問題にならない程度ですので、このまま使用したいと思います。
本当にありがとうございました。

suepon.com | CGI作成/CGI制作 | JavaScript | ドメイン検索 | バナー自動作成 | Google ダンスツール | 松浦亜弥 | H.P.memo | パソコン | ネイル

Copyright (C) 2002 - 2009 suepon , All rights reserved. Powered by CGI Script Market.