Maybe we'll have encoded filenames support in perl 5.12?
My "current state of support" comment was a reference to OS-level issues (on whatever OS). I would not expect such support from perl any time soon, given that there is no consistent form of OS support. | [reply] |
Well, Win32 has had stable support for Unicode filenames for many years. Perl's support for that is woeful but I'm working on that. I'd make a joke about "Real" operating systems, but it seems the Unix mongers may need a break from that in order to recover their sense of humor. (:
| [reply] |
One problem, even with Win32, is that you can have multiple filesystems on a single system, even within a single tree. Not every filesystem handles filenames the same way. Any solution for Perl would be incomplete without the possibility to override the encoding decision per path.
I'm hoping for a solution that is sufficiently abstracted that all platforms can use it. Win32's implementation would probably be a bit easier than one for, say, Linux, but even if you have to set things explicitly per path, it's better than what we have now. The following is copied from a post to p5p a while ago.
I tend to agree, however pragmas tend to be global, program- or packagewise, and what suits best here is individual, perl-call flag.
Global is a problem in most cases, but I feel it would be perfect here,
simply because the filesystem is equally global. In fact, it's even
longer lived than your Perl program :)
Better yet, global variables can be localized to dynamic scope. This is
good, because when you set the encoding for /foo, it should work for
encoding-unaware modules too.
Maybe a hash would be nice:
${^FS_ENCODING}{foo} = 'A';
${^FS_ENCODING}{foo}{bar} = 'B';
${^FS_ENCODING}{foo}{bar}{baz}{quux} = 'auto';
open my $fh, ">", "/foo/bar/baz/quux/blah/hello.txt";
Which then actually does:
open my $fh, ">", join("/",
""
encode(detect_encoding("/"), "foo"),
encode("A", "bar"),
encode("B", "baz"),
encode("B", "quux"),
encode(detect_encoding("/foo/bar/baz/quux"), "blah"),
encode(detect_encoding("/foo/bar/baz/quux/blah"), "hello.txt")
+,
);
| [reply] [d/l] [select] |