#!/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;
}