Wide character in print at と日本語ファイル名が文字化けする2点を修正したものです。
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use v5.18;
use Cwd;
use Encode;
use Encode::Locale;
binmode STDOUT, ':encoding(console_out)';
if ($^O eq 'darwin') {
require Encode::UTF8Mac;
$Encode::Locale::ENCODING_LOCALE_FS = 'utf-8-mac';
}
say '1.';
print "ディレクトリ名を入力: ";
chomp(my $dir = <STDIN>);
if ($dir =~/^\s*$/) {
chdir or die "cannot chdir to home directory: $!";
} else {
chdir $dir or die "cannot chdir to $dir: $!";
}
say 'The current working directory is ', getcwd();
for (sort <*>) {
say decode locale_fs => $_;
}
# diff -u mason/note/2019/09/a-code-orig.pl mason/note/2019/09/a-code.pl
--- mason/note/2019/09/a-code-orig.pl 2019-09-04 13:55:07.145300000 +0900
+++ mason/note/2019/09/a-code.pl 2019-09-04 13:59:05.276605000 +0900
@@ -1,10 +1,20 @@
#!/usr/bin/env perl
+
use strict;
use warnings;
use utf8;
use v5.18;
use Cwd;
+use Encode;
+use Encode::Locale;
+binmode STDOUT, ':encoding(console_out)';
+
+if ($^O eq 'darwin') {
+ require Encode::UTF8Mac;
+ $Encode::Locale::ENCODING_LOCALE_FS = 'utf-8-mac';
+}
+
say '1.';
print "ディレクトリ名を入力: ";
@@ -19,5 +29,5 @@
say 'The current working directory is ', getcwd();
for (sort <*>) {
- say $_;
+ say decode locale_fs => $_;
}
Windows や Mac での下記は、整っていないと言わざるをえないと思います。
https://rt.perl.org/Public/Bug/Display.html?id=134286
- command line arguments
- filenames across many different operators
- process creation (system, exec, readpipe/qx(), pipe open())
- environment variables
- console (maybe)
- many similar changes in bundled modules
Perl5流のバイト列に拘るにしても、整備する必要を感じます。
ここが問題で、ファイル名を渡す・操作する・返す形のモジュールにおいて、ASCIIのファイル名を扱う限り問題が起きませんが
日本語を含むと問題が起きるので、そのモジュールの使用を躊躇えざるをえません。
File::Find や File::Find::Rule などのちょっとしたこを簡単にこなせるPerl5らしいモジュールがありますが、ASCII以外だと躊躇います。
https://randomgeekery.org/2019/06/01/weighing-files-with-python/
書き捨ての簡単なファイル操作を行うスクリプトにおいても ASCII 外では perl5 では、分かっていても面倒だと思います。
(Linux などを UTF-8 で運用していたり、Windows のベータ機能 CP_UTF8 では問題ないのですが)
cygwin や msys の Perl は UTF-8 が返ってくるので、上の問題はありません。
しかし Wx や Prima などの GUI ツールキット は cygwin や msys に対応していません。
おそらく wxWidgets 自体も msys に対応していません。
なお mingw64 の Perl は CP932 が返ります。