投稿されたメッセージが日本語かどうか調べる

投稿されたメッセージに日本語が含まれているかを調べ、含まれていなければ拒否するという方法は、スパム対策で役に立ちます。ここでは、指定された文字列に日本語が含まれるか調べる方法を紹介します。

Perl

Jcodeのgetcodeで調べる

Jcode.plまたはJcode.pmのgetcodeを使用して文字コードを調べることができます。日本語の場合は結果として、"ascii"、"binary"以外を返しますが、日本語であっても無くてもundefを返す可能性があります。

Jcode.plを使って文字列がShift JISかどうか確かめる例を示します。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
#調べる文字列
$msg = "あいうえお";
 
require './jcode.pl';
local($match, $code) = &jcode'getcode(*msg);
if ($code ne 'sjis')
{
	print 'SJISではありません。';
	exit;
}

ひらがな、カタカナが含まれているか調べる

Jcodeのgetcodeは結構重いので、ひらがなやカタカナが含まれているかだけ調べたほうが簡単です。

以下の例では、文字列がShift JISのときに、ひらがなやカタカナが含まれているか調べています。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
#調べる文字列
$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;
}

上記の例では、ひらがなでは、「ぁ」から「ん」までの間にある文字が含まれているかを調べています。カタカナでは、「ァ」から「ヶ」です。半角カタカナは含みません。詳しくは、文字コード表をご覧ください。

EUCの場合は、正規表現パターンを以下のように変更します。

文字コードひらがなカタカナ
Shift JIS\x82[\x9F-\xF1]\x83[\x40-\x96]
EUC\xA4[\xA1-\xF3]\xA5[\xA1-\xF6]

私の経験では、このようにしても、日本語以外の言語(何語だかは分からないが)が許可されてしまうことがあります。特にカタカナを許可するとその確率が上がるため、ひらがなが含まれているかだけを調べたほうがよさそうです。

PHP

mb_detect_encodingを使用する

mb_detect_encodingを使用して、文字コードを判別することができます。mb_detect_encodingが"ASCII"を返した時は日本語ではないと判断します。

  1
  2
  3
  4
  5
  6
  7
//調べる文字列
$msg = 'あいうえお';
 
if (mb_detect_encoding($msg) == 'ASCII')
{
    exit('日本語ではありません。');
} 

ひらがな、カタカナが含まれているか調べる

これは、Perlで紹介した方法と同じです。

もしmb_eregやmb_ereg_matchが使えるのであれば、次のようにできます。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
//調べる文字列
$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の例です。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
//調べる文字列
$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

ひらがな、カタカナが含まれているか調べる

ASP.NETでも、PerlやPHPと基本的には同じ方法でできます。

VB.NET

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
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#

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
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

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
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#

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
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;
}

ページ情報
[ トップ ]   [ 編集 | 凍結 | 差分 | バックアップ | 添付 | 複製 | 名前変更 | リロード ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]