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