*投稿されたメッセージが日本語かどうか調べる [#gf4cac63] 投稿されたメッセージに日本語が含まれているかを調べ、含まれていなければ拒否するという方法は、スパム対策で役に立ちます。ここでは、指定された文字列に日本語が含まれるか調べる方法を紹介します。 **Perl [#b0245dda] ***Jcodeのgetcodeで調べる [#dbdde285] Jcode.plまたは[[Jcode.pm>http://perldoc.jp/docs/modules/Jcode-0.82/Jcode.pod]]のgetcodeを使用して文字コードを調べることができます。日本語の場合は結果として、"ascii"、"binary"以外を返しますが、日本語であっても無くてもundefを返す可能性があります。 Jcode.plを使って文字列がShift JISかどうか確かめる例を示します。 #code(perl){{ #調べる文字列 $msg = "あいうえお"; require './jcode.pl'; local($match, $code) = &jcode'getcode(*msg); if ($code ne 'sjis') { print 'SJISではありません。'; exit; } }} ***ひらがな、カタカナが含まれているか調べる [#vdf17374] Jcodeのgetcodeは結構重いので、ひらがなやカタカナが含まれているかだけ調べたほうが簡単です。 以下の例では、文字列がShift JISのときに、ひらがなやカタカナが含まれているか調べています。 #code(perl){{ #調べる文字列 $msg = "あいうえお"; $in_hiragana = 0; $in_katakana = 0; if ($msg =~ /\x82[\x9F-\xF1]/) { #ひらがなが含まれている $in_hiragana = 1; } if ($msg =~ /\x83[\x40-\x96]/) { #カタカナが含まれている $in_katakana = 1; } if (!$in_hiragana && !$in_katakana) { print 'ひらがなもカタカナも含まれていません。'; exit; } }} 上記の例では、ひらがなでは、「ぁ」から「ん」までの間にある文字が含まれているかを調べています。カタカナでは、「ァ」から「ヶ」です。詳しくは、[[文字コード表>http://www.kishugiken.co.jp/cn/index.html]]をご覧ください。 EUCの場合は、正規表現パターンを以下のように変更します。 |文字コード|ひらがな|カタカナ|h |Shift JIS|\x82[\x9F-\xF1]|\x83[\x40-\x96]| |EUC|\xA4[\xA1-\xF3]|\x83[\x40-\x96]| 私の経験では、このようにしても、日本語以外の言語(何語だかは分からないが)が許可されてしまうことがあります。特にカタカナを許可するとその確率が上がるため、ひらがなが含まれているかだけを調べたほうがよさそうです。 **PHP [#e21c94fe] ***mb_detect_encodingを使用する [#v3e2c7ae] mb_detect_encodingを使用して、文字コードを判別することができます。mb_detect_encodingが"ASCII"を返した時は日本語ではないと判断します。 #code(php){{ //調べる文字列 $msg = 'あいうえお'; if (mb_detect_encoding($msg) == 'ASCII') { exit('日本語ではありません。'); } }} ***ひらがな、カタカナが含まれているか調べる [#u535dc2d] これは、Perlで紹介した方法と同じです。 もしmb_eregやmb_ereg_matchが使えるのであれば、次のようにできます。 #code(php){{ //調べる文字列 $msg = 'あいうえお'; $in_hiragana = FALSE; $in_katakana = FALSE; if (mb_ereg('[ぁ-ん]', $msg)) { //ひらがなが含まれる $in_hiragana = TRUE; } if (mb_ereg('[ァ-ヶ]', $msg)) { //カタカナが含まれる $in_katakana = TRUE; } if (!$in_hiragana && !$in_katakana) { exit('ひらがなもカタカナも含まれません。'); } }} もしこれらが使えないのであれば、Perlの例と同じように、eregやpreg_matchを使用します。 #code(php){{ //調べる文字列 $msg = 'あいうえお'; $in_hiragana = FALSE; $in_katakana = FALSE; if (preg_match('/\x82[\x9F-\xF1]/', $msg)) { //ひらがなが含まれる $in_hiragana = TRUE; } if (preg_match('/\x83[\x40-\x96]/', $msg)) { //カタカナが含まれる $in_katakana = TRUE; } if (!$in_hiragana && !$in_katakana) { exit('ひらがなもカタカナも含まれません。'); } }} //これより下は編集しないでください #pageinfo(,2007-05-12 (土) 01:48:16,DOBON!,2007-05-12 (土) 02:57:23,DOBON!) |