perlでのShift_JIS,cp932の扱いテスト

perlにencodingを指定するとき、shiftjisなのかcp932なのかちゃんと考えないといけない。でないと全角マイナスの扱いが違ってくる。

hz.pl

#!/usr/bin/perl

use strict;
use warnings;

use utf8;
use Encode;

use Data::Dumper;

binmode STDOUT => 'utf8';

# hz.txtの最後の文字が調査したい文字
#open F, "<:encoding(shiftjis)", "hz.txt";
#open F, "<:encoding(Windows-31J)", "hz.txt";
open F, "<:encoding(cp932)", "hz.txt";

while (<F>) {
	/(.)$/;
	my $hex = sprintf("%02X", ord($1));
	print "半角ハイフン" if /\x{2D}$/;
	print "全角長音" if /\x{30FC}$/;
	print "shiftjis指定時の全角マイナス" if /\x{2212}$/;
	print "cp932(Windows-31J)指定時の全角マイナス" if /\x{FF0D}$/;
	print "全角ハイフン" if /\x{2010}$/;
	print "全角ダッシュ" if /\x{2015}$/;
	print " code = [0x${hex}] string: $_";
#	print Dumper($_);
}
close(F);

hz.txt

Shift_JIS(いわゆるCP932)で改行はLFのテスト用テキストファイル。

半角ハイフン-
全角長音ー
全角マイナス−
全角ダッシュ―
全角ハイフン‐

実行

$ perl hz.pl hz.txt
半角ハイフン code = [0x2D] string: 半角ハイフン-
全角長音 code = [0x30FC] string: 全角長音ー
cp932(Windows-31J)指定時の全角マイナス code = [0xFF0D] string: 全角マイナス−
全角ダッシュ code = [0x2015] string: 全角ダッシュ―
全角ハイフン code = [0x2010] string: 全角ハイフン‐
$

考察

Windowsで作られたファイルについてはやはりCP932を指定するべきと思われる。