Dear Rui,
I probably missed the start of this thread where you said that you couldn't
use Perl 5.6. But if you could use Perl 5.6, then something like this would
work:
open(INFILE, "<$ARGV[0]") || die "Can't read $ARGV[0]";
open(OUTFILE, ">$ARGV[1]") || die "Can't write $ARGV[1]";
binmode OUTFILE;
print OUTFILE pack('v', 0xfeff);
while(<INFILE>)
{
s/\n$/\015\012/o;
print OUTFILE pack('v*', unpack('U*', $_));
}
close(OUTFILE);
close(INFILE);
Some thoughts on this code, which I use.
1. It is set up to work in the Windows environment, hence the newline tidy ups
and the use of 'v' for packing.
2. It doesn't support surrogates. But you could get around this by changing the
key line to something like (this is untested):
$s = $_;
print OUTFILE pack ('v*' map {$_ > 0xFFFF ? (($_ >> 10) + 0xD800, ($_ & 0x3FF)
+ 0xDC00) : $_} unpack ('U*', $s));
HTH,
Martin