- 追加された行はこの色です。
- 削除された行はこの色です。
*日本語かどうか調べる [#gf4cac63]
*投稿されたメッセージが日本語かどうか調べる [#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 (土) 01:48:16,DOBON!)
#pageinfo(,2007-05-12 (土) 01:48:16,DOBON!,2007-05-12 (土) 02:57:23,DOBON!)