On Wed, 19 Jan 2011, Michael Ludwig wrote:
> Erland Sommarskog schrieb am 17.01.2011 um 13:57 (-0000):
> > I'm on Windows and I have this small script:
> >
> >    use strict;
> >    open F, '>:encoding(UTF-16LE)', "slask2.txt";
> >    print F "1\n2\n3\n";
> >    close F;
> >
> > When I open the output in a hex editor I see
> >
> >   31 00 0D 0A 00 32 00 0D 0A 00 33 0D 0A 00
> 
> 
> It looks like a bug to me. I'm getting the same result as you for:
> 
> * ActivePerl 5.10.1
> * ActivePerl 5.12.1
> * Strawberry 5.12.0
> 
> All three participants show correspondingly wrong results for UTF-16BE.
> And also for UTF-16, which just adds the BOM.
> 
> Perl/Cygwin 5.10.1 does fine because its OS is "cygwin", so it doesn't
> translate "\n" to CRLF.

You need to stack the I/O layers in the right order.  The :encoding() layer
needs to come last (be at the bottom of the stack), *after* the :crlf layer
adds the additional carriage returns.  The way to pop the default :crlf
layer is to start out with the :raw pseudo-layer:

  open(my $fh, ">:raw:encoding(UTF-16LE):crlf", $filename) or die $!;

Cheers,
-Jan

Reply via email to