• 追加された行はこの色です。
  • 削除された行はこの色です。
*投稿されたメッセージが日本語かどうか調べる [#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]|\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を使用します。下のコードは、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のブロック名を使用することもできます。ブロック名を使用した場合は、上記の方法(ひらがなは[ぁ-ん]で、カタカナは[ァ-ヶ]の範囲)よりも、ひらがな、カタカナの範囲が広がります。範囲が広がることによりひらがな、カタカナと判断されるようになる文字は、めったに使われる文字ではありませんので、上記のような方法で問題ないです(範囲が広がりすぎるのもよくありませんので)。
.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-13 (日) 03:14:51,DOBON!)
#pageinfo([[:Category/インターネット]],2007-05-12 (土) 01:48:16,DOBON!,2009-02-08 (日) 16:48:42,DOBON!)


[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]