[Edit][Create New]
[ IndexPage / ネットとプログラミング / CGI / 便利なスクリプト片(未整理) / isIzon.pl ]

isIzon.pl

#!/usr/local/bin/perl

# ここで依存文字とは「ISO-2022-JPで使用されない文字セットの文字」を指します
# 具体的には、ASCII、カタカナを除くJIS X 0201、JIS X 0208以外の文字セット
# を「依存文字」としています

$str   = join(undef, <>);
$error = &isIzon(\$str);

if($error){
	if($error =~ /\w/){
		print "EUC文字列ではありません";
	}else{
		print "以下は機種依存文字です\n$error\n";
	}
}else{
	print "おっけー\n";
}

# ''が返れば依存文字なし。
# もし依存文字があれば、該当した文字全てを連結したものが帰る
# EUCテキストではない場合、ASCIIを含む文字列(not a EUC-JP text.)が返る

sub isIzon{
	my($ref) = shift;
	my($ascii, $twoBytes, $threeBytes, $izon, $return);

	# $str に $pattern を正しくマッチさせる

	# アスキー文字
	$ascii = '[\x00-\x7F]';
	# 普通のEUC-JP文字(JIS X 0201 Katakana含む)
	$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
	# G3集合(JIS X 0212)の文字
	$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

	# JIS X 0201 Katakana(いわゆる半角カナ)とJIS X 0208未定義文字(JIS X 0212含)
	$izon = "[\x8E\xA9-\xAF\xF5-\xFE][\xA1-\xFE]|$threeBytes";

	unless($$ref =~ /^(?:$ascii|$twoBytes|$threeBytes)*$/) {
		return 'not a EUC-JP text.';
	}

	while($$ref =~ /\G(?:$ascii|$twoBytes|$threeBytes)*?((?:$izon)+)/g) {
		$return .= $1;
	}
	$return;
}