プロが教えるわが家の防犯対策術!

ロシア文字の排除をしたいと思い、
以下のように記述してみたのですが
カタカナの「ヤツ」「ヤッ」に以下でマッチングしてしまいます。
文字コードはShift-jisを使用しているのですが
誤判定を回避する策はないでしょうか?

roshia_moji=qw(А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я);

foreach (@roshia_moji) {
if (index($a,$_) >= 0){
push(@error, 'ロシア文字は使用できません。');last;
}
}

A 回答 (1件)

通常、Shift_JISの2バイト文字は「2文字」として処理されます。


'ヤツ'は2文字ではなく、 "\x83\x84\x83\x63" の4文字です。
同様に、このロシア文字も2バイト文字なので、それぞれが2文字扱いです。

ここで、'с'は"\x84\x83"です。
この"\x84\x83"がヤの2バイト目+ツの1バイト目と一致します。

対策は、次のどちらかになります。
・2バイト文字を考慮するものを利用する。場合によっては自作する。
・Encodeモジュールを使って、 utf8文字列にdecodeする。
utf8文字列にすれば、多バイト文字でも「1文字」扱いになるので、index等が普通に使える。
    • good
    • 0
この回答へのお礼

なるほど、そのような理由だったのですね。
utf8で試してみたのですが、たぶん私の記述に問題があったのだと思うのですが
誤判定が多かったので、これに2バイト目が83で終わる文字すべてを指定して
その文字があったらロシア文字として扱わないようにしました!
どうもありがとうございました!!

お礼日時:2013/01/15 10:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!