- 追加された行はこの色です。
- 削除された行はこの色です。
*投稿されたメッセージが日本語かどうか調べる [#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]]をご覧ください。
上記の例では、ひらがなでは、「ぁ」から「ん」までの間にある文字が含まれているかを調べています。カタカナでは、「ァ」から「ヶ」です。半角カタカナは含みません。詳しくは、[[文字コード表>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]|
|EUC|\xA4[\xA1-\xF3]|\xA5[\xA1-\xF6]|
私の経験では、このようにしても、日本語以外の言語(何語だかは分からないが)が許可されてしまうことがあります。特にカタカナを許可するとその確率が上がるため、ひらがなが含まれているかだけを調べたほうがよさそうです。
**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を使用します。
もしこれらが使えないのであれば、Perlの例と同じように、eregやpreg_matchを使用します。下のコードは、Shift JISの例です。
#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('ひらがなもカタカナも含まれません。');
}
}}
**ASP.NET [#aa8c7cc6]
***ひらがな、カタカナが含まれているか調べる [#ua154811]
ASP.NETでも、PerlやPHPと基本的には同じ方法でできます。
VB.NET
#code(vbnet){{
Dim inHiragana As Boolean = False
Dim inKatakana As Boolean = False
If System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "[ぁ-ん]") Then
'ひらがなが含まれている
inHiragana = True
End If
If System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "[ァ-ヶ]") Then
'カタカナが含まれている
inKatakana = True
End If
If Not inHiragana And Not inKatakana Then
Label1.Text = "ひらがなもカタカナも含まれていません。"
Return
End If
}}
C#
#code(csharp){{
bool inHiragana = false;
bool inKatakana = false;
if (System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "[ぁ-ん]"))
{
//ひらがなが含まれている
inHiragana = true;
}
if (System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "[ァ-ヶ]"))
{
//カタカナが含まれている
inKatakana = true;
}
if (!inHiragana && !inKatakana)
{
Label1.Text = "ひらがなもカタカナも含まれていません。";
return;
}
}}
.NETではさらにUnicodeのブロック名を使用することもできます。ブロック名を使用した場合は、上記の方法(ひらがなは[ぁ-ん]で、カタカナは[ァ-ヶ]の範囲)よりも、ひらがな、カタカナの範囲が広がります。範囲が広がることによりひらがな、カタカナと判断されるようになる文字は、めったに使われる文字ではありませんので、上記のような方法で問題ないです(範囲が広がりすぎるのもよくありませんので)。
VB.NET
#code(vbnet){{
Dim inHiragana As Boolean = False
Dim inKatakana As Boolean = False
If System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "\p{IsHiragana}") Then
'ひらがなが含まれている
inHiragana = True
End If
If System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "\p{IsKatakana}") Then
'カタカナが含まれている
inKatakana = True
End If
If Not inHiragana And Not inKatakana Then
Label1.Text = "ひらがなもカタカナも含まれていません。"
Return
End If
}}
C#
#code(csharp){{
bool inHiragana = false;
bool inKatakana = false;
if (System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "\\p{IsHiragana}"))
{
//ひらがなが含まれている
inHiragana = true;
}
if (System.Text.RegularExpressions.Regex.IsMatch(TextBox1.Text, "\\p{IsKatakana}"))
{
//カタカナが含まれている
inKatakana = true;
}
if (!inHiragana && !inKatakana)
{
label1.Text = "ひらがなもカタカナも含まれていません。";
return;
}
}}
//これより下は編集しないでください
#pageinfo(,2007-05-12 (土) 01:48:16,DOBON!,2007-05-12 (土) 02:57:23,DOBON!)
#pageinfo(,2007-05-12 (土) 01:48:16,DOBON!,2007-05-13 (日) 03:14:51,DOBON!)