- ベストアンサー
index関数で日本語を使用する場合の問題
csvファイルから、ある文字列で検索できるスクリプトを作っています。 DBCSを使用した場合、引っかかってほしくない文字列が検索に引っかかってしまい困ってます。 例えば、'件'をキーに検索すると、'東秀'というデータが引っかかってしまいます。 例: =================================== $data = '東秀'; $key = '件'; $result = index($source,$key); print"$result\n"; =================================== この例では、$keyの文字列は$dataの中に存在しないので $resultには -1 が返ってくるはずですが、結果は 1 が返ってきます。 このような結果が返ってくる理由は、以下のように「東」の2バイト目と 「秀」の1バイト目を足したものが、「件」と同じものだからだ、というのが分かります。 東:0x938C 秀:0x8F47 件:0x8C8F 文字コードにEUCを使用すれば解決できそうですが、データはShift-JISで存在するため、 そのままShift-JISで使用したいのです。 ●環境: OS: Windows2000(SP4) Perl: Active Perl v5.8.3 データの文字コード: Shift-JIS '件'をキーに検索しても、'東秀'というデータが引っかかってこない方法がありましたら ご教授お願いします。 私が根本的にPerlを理解していないのかもしれません。 Perl5.6以降は日本語も1文字として処理される、と思っていたのですが、 私の認識が間違ってますでしょうか。 よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
とくにシフトJISしか使わないなら use encoding "shiftjis"; っての、入れればよいかと。
その他の回答 (1)
#1の方の回答でどうにかなればいいんですが、念のため、俺が作ったフリーのDBソフトで使ってる方法を書いておきます。 凄い変なことしてます(笑) もうちょっとスマートな方法がないかな、とは思ってるんですが(^_^; sub xindex { if ( $_[1] =~ /^[\x81-\x9f\xe0-\xef]/ ) { return index($_[0], $_[1]); } if ( length($_[1]) == 0 ) { return -1; } $f = substr($_[1], 0, 1); $len = length($_[0]); for ( $i = 0; $i < $len; $i++ ) { $c = substr($_[0], $i, 1); if ( $c =~ /[\x81-\x9f\xe0-\xef]/ ) { $bit = 1; } else { if ( $c eq $f ) { if ( !$bit ) { return index($_[0], $_[1]); } } $bit = 0; } } return -1; }
お礼
#1さんの方法で解決できました。 ありがとうございます。 こちらも今後のため、参考にさせていただきます。
お礼
この方法で解決できました。 ありがとうございます。