On Thu, 24 Feb 2005, Ed Batutis wrote:
So the problem I have is how to proceed. Should I give up with
Perl and use Java or C? Any suggestions gratefully received.
I started a really 'fun' flame war on this topic several months ago,
so I hesitate to say anything more. But, yes, you should give up on
Perl - or run your script on Linux with a utf-8 locale. On Win32, Perl
internals are converting the filename characters to the system default
code page. So, you are SOL for what you are trying to do.
Actually, you *can* work around the problems on Windows by using the
Win32API::File and the Encode module. Here is a sample program
Gisle came up with:
#!perl -w
use strict;
use Fcntl qw(O_RDONLY);
use Win32API::File qw(CreateFileW OsFHandleOpenFd :FILE_ OPEN_EXISTING);
use Encode qw(encode);
binmode(STDOUT, ":utf8");
my $h = CreateFileW(encode("UTF-16LE", "\x{2030}.txt\0"), FILE_READ_DATA,
0, [], OPEN_EXISTING, 0, []);
my $fd = OsFHandleOpenFd($h, O_RDONLY);
die if $fd < 0;
open(my $fh, "<&=$fd");
binmode($fh, ":encoding(UTF-16LE)");
while (<$fh>) {
print $_;
}
close($fh) || die;
__END__
It may be possible to do similar readdir() emulation as well.
Win32::APIFile is part of libwin32 and already included in ActivePerl.
Cheers,
-Jan