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

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

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]\x83[\x40-\x96]

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

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を使用します。

  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('ひらがなもカタカナも含まれません。');
} 

ページ情報
  • 作成日 : 2007-05-12 (土) 01:48:16
  • 作成者 : DOBON!
  • 最終編集日 : 2007-05-12 (土) 02:57:23
  • 最終編集者 : DOBON!
[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]