互換性を壊さない為だと思うのだけど、ファイルシステムやターミナルのエンコーディングを意識するレイヤーがコアに統合されていない。

Python や Ruby には、ずっと前からある。

社内の共有フォルダを覗くと ㈱ ① ♡ などが沢山みつかる。
これでは File::Find も、ままならない。(ハートが decode できない。GetLongPathName とか。。。)
モジュールにファイル名を渡す系 (例えば Spreadsheet::XLSX ) などがツラい。(事前に GetANSIPathName|CreateFile!?)
モジュールにファイル名が返ってくる系がツラい。 IO::All の io($dir)->All_Files が使えなくてへこむ。

Win32::Unicode には助けられていますし Win32::LongPath 、さらには Win32::FindFile もあるにはある。
-f などの為に Overload::FileCheck するのもだし、@ARGV や %ENV が GetACP なので文字集合が狭まっちゃうのが痛い。

"ベータ: ワールドワイド言語サポートで Unicode UTF-8 を使用" がOnで運用できるか
これがプログラム毎に切り替えられるようになるか
SetACP などが実装されるかすれば、現在のPerlでも理想的ではあると思う。

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

https://rt.perl.org/Public/Bug/Display.html?id=130831

https://www.nntp.perl.org/group/perl.perl5.porters/2018/08/msg251899.html

https://metacpan.org/pod/UTF8::R2#Perl's-motto
バイトに拘るにしても ansi系 が wide系 に比べて狭い文字集合なんだから
wide系のバイトを返す・渡せる手段も残さないとではないかな。。。(UTF-16LEであったとしても)

エクスプローラなどで CP_ACP 外のファイル名が手軽に作れるのに
CP_ACP が固定で、かつ最近になってベータ機能をOnにすると 65001 が返るとか。。。

例えば エンコードレイヤー

#!/usr/bin/env perl

use utf8;
use strict;
use warnings;
use feature ":5.10";

use Encode::Locale;

use open IO => ":utf8";
binmode STDIN, ":encoding(console_in)";
binmode STDOUT, ":encoding(console_out)";

say "日本語", "♡";

__END__

C:\msys64\home\bokutin\git\win32_term>perl enc.pl
"\x{2661}" does not map to cp932 at enc.pl line 14.
日本語\x{2661}

C:\msys64\home\bokutin\git\win32_term>perl enc.pl > a
"\x{2661}" does not map to cp932.

C:\msys64\home\bokutin\git\win32_term>type a
日本語\x{2661} (cp932)

WriteConsoleW

#!/usr/bin/env perl

use utf8;
use strict;
use warnings;
use feature ":5.10";

use if $^O eq 'MSWin32', 'Win32::Unicode::Native';
binmode STDOUT, ":utf8";

say "日本語", "♡";

__END__

C:\msys64\home\bokutin\git\win32_term>perl wide.pl
日本語♡ (ハートが?になる場合はフォントを変えてみてください)

C:\msys64\home\bokutin\git\win32_term>perl wide.pl > a

C:\msys64\home\bokutin\git\win32_term>type a
譌・譛ャ隱樞劭 (UTF8)

コメントする

perl adv
perl adv