極悪です。
>piconv の中身は入力を行単位で読んでるので、リトルエンディア
>ンのファイルを読むと、0A00 が泣き別れになるのが原因でした。
PerlIO はこの辺もちゃんと面倒を見てくれるようです。
--^pxd.pl
#!/usr/local/bin/perl
use strict;
my $fo = "con";
use Getopt::Std;
my %opt;
getopts('f:t:',\%opt);
$opt{f} ||= 'CP932';
$opt{t} ||= 'CP932';
open(my $FO,">:encoding($opt{t})",$fo) or die;
foreach my $fi (@ARGV){
open(my $FI,"<:encoding($opt{f})",$fi) or next;
while(<$FI>){
# $_ = unpack("H*",$_); s/../ $&/g; chomp;
printf $FO $_;
};
close $FI;
}
close $FO;
__END__
--$
D:% xd -eb 16BE-BOM.txt
0000000 feff 307b 3052 000d 000a 307b 3052 000d
0000010 000a
0000012
D:% xd -eb 16BE-N.txt
0000000 307b 3052 000d 000a 307b 3052 000d 000a
0000010
D:% xd -eb 16LE-BOM.txt
0000000 fffe 7b30 5230 0d00 0a00 7b30 5230 0d00
0000010 0a00
0000012
D:% xd -eb 16LE-N.txt
0000000 7b30 5230 0d00 0a00 7b30 5230 0d00 0a00
0000010
D:% perl pxd.pl -f UTF-16 -t CP932 16BE-BOM.txt
ほげ
ほげ
D:% perl pxd.pl -f UTF-16 -t CP932 16LE-BOM.txt
ほげ
ほげ
D:% perl pxd.pl -f UTF-16BE -t CP932 16BE-N.txt
ほげ
ほげ
D:% perl pxd.pl -f UTF-16LE -t CP932 16LE-N.txt
ほげ
ほげ
D:%
UTF-16 は必ず BOM を要求するようです(自動で BE とは
しない)。
D:% perl pxd.pl -f UTF-16 -t CP932 16BE-N.txt
UTF-16:Unrecognised BOM 307b at pxd.pl line 18.
D:% perl pxd.pl -f UTF-16 -t CP932 16LE-N.txt
UTF-16:Unrecognised BOM 7b30 at pxd.pl line 18.
D:%
--
FZH01112 at nifty.com
http://hpcgi1.nifty.com/dune/gwiki.pl?