# 正規表現では変換不可な連番でないパターンテーブル
# ただしここでは半角文字が書けないので
# 正確には'半角' => '全角' になっています。
%utf8tbl = (
'¥' => '\\',
'。' => '。', '「' => '「', '」' => '」', '、' => '、', '・' => '・',
'ッ' => 'ッ', 'ー' => 'ー',
'タ' => 'タ', 'チ' => 'チ',
'ワ' => 'ワ', 'ヲ' => 'ヲ', 'ン' => 'ン', '゛' => '゛', '゜' => '゜',
'ヴ' => 'ヴ',
'ダ' => 'ダ', 'ヂ' => 'ヂ', 'ヅ' => 'ヅ', 'デ' => 'デ', 'ド' => 'ド'
);
# いかんUTF-8文字を変換
sub utf8chconv($){
$_ = $_[0];
if(/\xef\xbd([\x80-\x9e])/){ # `a..z{|}~
$ret = chr(ord($1) - 32);
}elsif(/\xef\xbc([\x81-\xbf])/){ # !../0..9:..@A..Z
$ret = chr(ord($1) - 96);
}elsif(/^\xef\xbd([\xa7-\xab])$/){ # ァィゥェォ
$ret = "\xe3\x82" . chr(ord($1) * 2 - 173);
}elsif(/^\xef\xbd([\xac-\xae])$/){ # ャュョ
$ret = "\xe3\x83" . chr(ord($1) * 2 - 181);
}elsif(/^\xef\xbd([\xb1-\xb5])$/){ # アイウエオ
$ret = "\xe3\x82" . chr(ord($1) * 2 - 192);
}elsif(/^\xef\xbd([\xb6-\xbf])$/){ # カキクケコサシスセソ
$ret = "\xe3\x82" . chr(ord($1) * 2 - 193);
}elsif(/^\xef\xbe([\x82-\x84])$/){ # ツテト
$ret = "\xe3\x83" . chr(ord($1) * 2 - 128);
}elsif(/^\xef\xbe([\x85-\x89])$/){ # ナニヌネノ
$ret = "\xe3\x83" . chr(ord($1) + 5);
}elsif(/^\xef\xbe([\x8a-\x8e])$/){ # ハヒフヘホ
$ret = "\xe3\x83" . chr(ord($1) * 3 - 271);
}elsif(/^\xef\xbe([\x8f-\x93])$/){ # マミムメモ
$ret = "\xe3\x83" . chr(ord($1) + 15);
}elsif(/^\xef\xbe([\x94-\x96])$/){ # ヤユヨ
$ret = "\xe3\x83" . chr(ord($1) * 2 - 132);
}elsif(/^\xef\xbe([\x97-\x9b])$/){ # ラリルレロ
$ret = "\xe3\x83" . chr(ord($1) + 15);
}elsif(/^\xef\xbd([\xb6-\xbf])\xef\xbe\x9e$/){ # ガギグゲゴザジズゼゾ
$ret = "\xe3\x82" . chr(ord($1) * 2 - 192);
}elsif(/^\xef\xbe([\x8a-\x8e])\xef\xbe\x9e$/){ # バビブベボ
$ret = "\xe3\x83" . chr(ord($1) * 3 - 270);
}elsif(/^\xef\xbe([\x8a-\x8e])\xef\xbe\x9f$/){ # パポプペポ
$ret = "\xe3\x83" . chr(ord($1) * 3 - 269);
}elsif(exists($utf8tbl{$_})){ # その他正規表現不可
$ret = $utf8tbl{$_};
}else{
$ret = $_;
}
return $ret;
}
sub utf8conv($){
$_[0] =~ s/$utf8ex/utf8chconv($&)/eg;
return $_[0];
}
# 使い方
$x = utf8conv($x);
自分で作った全角英数禁止、半角カナ禁止スクリプトです。
ただし、UTF-8です(お呼びでない?)。
UTF-8、改行コードLFでソースを記述してください。
お礼
やはりSJISでやるのはあきらめた方がいいのか・・・ そう思いかけた矢先、ftp さんのご指摘で、ハッと 気が付きました。おっしゃる通りです。 本日帰ったら試してみます。 回答に心より感謝いたします。
補足
お名前間違えていました。大変失礼いたしました!!!