• ベストアンサー

漢字の扱い

早速ですが、 覚えたことをメモ(形式は普通の日本語テキスト)しており、 あとから検索でキーワードを与えると該当の文章を抜き出し表示するようなcgiを作っています。 基本的には上手く行くのですが、漢字をキーワードに入れると抜き出せるときと、抜き出せないときがあります。 抜き出しは此処で教わった、 if($target =~ m/$key/i) {実行rtn を使っています。 どのような対処が必要でしょうか。 理由と対処法を教えてください。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

まず、その方法では、$keyは「正規表現」として解釈されます。 例えば、 「.」(ピリオド)を検索しようとすると、全ての文字がマッチします。 また、明示的に設定したり、昔のJperlのような改造版でも無い限り、日本語は「複数のバイト列」です。 そのため、Shift_JISで顕著な、俗に「ダメ文字」と呼ばれる問題があります。 特に、正規表現では、通常「ダメ文字」と言われる\を含む文字の他にも、メタ文字として使われる文字(|等)も対象となるので、かなりの数の文字が誤判定されます。 単に文字列が含まれるかどうかだけなら、index関数を使う方が確実です。 または、\Q$key\Eとして$key中のメタ文字から特殊な意味を無くしてしまうか。 ただ、いずれの場合でも、漢字の途中から(あるいは途中まで)マッチするケースがあります。 Encodeを使ってUnicode文字列に変換して、漢字を1文字として扱うようにした方がよいかもしれせん。

nagahaha
質問者

お礼

早速有り難うございました。 言われていることが、何となくですが、分かります。 前にも似たような質問をしたことがあり、 その時にも勉強したのですが、今ひとつ自分のものにできていません。 基礎が出来ていないからでしょう。 今回も同じようにならないため、もう少し踏み込んで勉強したいと思います。 (1)index関数 (2)\Q$key\Eとして$key中のメタ文字から特殊な意味を無くしてしまう (3)Encodeを使ってUnicode文字列に変換する (1)、(2)は何とか検索などで調べられ、やってみられるかなと思いますが、 (3)は何処か参考になるサイトなり、サンプルなりはありますでしょうか。 私のやりたいことからして、(3)が一番適切かなと思うのですが。 宜しくお願いします。

nagahaha
質問者

補足

お世話になります。 その後、調べたり考えたりした結果、 問題は漢字だったので、前から使っていたindexによる検索を併用して解決しました。 m//iは英字の大文字小文字混在を解決すべく変更したモノで、 漢字とは排他の関係にありますので。 unicodeは少し読んでみましたが、一からしっかり読まなくてはならないと思います。 勉強してみます。 どうも有り難うございました。

関連するQ&A