シフトJISの特定の文字がうまく処理できないときの対応

最近、シフトJISで入力された文字列を処理しなければならない
というやっかいな仕事をこなしていたのですが

use utf8;
use Encode;
.
.
.
binmode FILEHANDLE, 'encoding(shiftjis)';
.
.
foreach (){
.
.
s/0/0/g;
s/1/1/g;
.
.
}

としていたわけです。
ところが、「s/−/-/g」のところがどうもうまくいかず。
いろいろ調べた結果、このような形で対処しました。

  1. http://ash.jp/code/unitbl21.htmで「−」のUTF8での文字コードを調べる
  2. 以下のように、文字コードをデコード

my $minus = "\x{00E2}\x{0088}\x{0092}";
utf8::decode($minus);

  1. 後は「s/$minus/-/g」で置換する



いやー、結構苦労しました。
シフトJISなんてなくなってしまえばよいのに
と思う今日この頃です。