Depends on what you mean by “correctly”. It does work correctly as-is,
creating output encoded as UTF-16LE with CR/LF line endings.
If you want different layers on different operating systems, then you will need
to tell the interpreter what exactly it is you want.
Which means you probably have to look at $^O. Assuming you don’t want the
:crlf layer on non-Windows systems it is as easy as:
open(my $fh, “:raw:encoding(UTF-16LE)”, $filename) or die $!;
binmode($fh, “:crlf”) if $^O eq “MSWin32”;
Cheers,
-Jan
PS: I saw some discussion today that the :raw pseudo-layer in the open() call
will also remove the buffering layer (it doesn’t do
that when you use it in a binmode() call). I’ll try to remember to send a
followup once I actually understand what is going on.
From: Bob Hallissy [mailto:Bob_Hallissy(_at_)sil(_dot_)org]
Sent: Thursday, January 20, 2011 7:40 PM
To: perl-unicode(_at_)perl(_dot_)org
Subject: Re: encoding(UTF16-LE) on Windows
Jan Dubois wrote:
Files opened on Windows already have the :crlf layer pushed by default,
so you somehow need to get the :encoding layer *below* it.
Is it possible to re-write the working statement
open(my $fh, ">:raw:encoding(UTF-16LE):crlf", $filename) or die $!;
in a way that works correctly on any platform (without referring to $^O) ?
Bob