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

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)

#!/usr/bin/env perl

use Modern::Perl;
use Benchmark qw(:all);

use Data::Util qw(is_instance);
use Params::Util qw(_INSTANCE);
use Ref::Util::XS qw(is_blessed_ref);
use Safe::Isa;
use Scalar::Util qw(blessed);
use Symbol;

my @vals = ( undef, '', [], {}, gensym, qr//, (bless {}, 'AAA') );

my $count = -1;

say "--> isa 判定";
cmpthese($count, {
    blessed => sub {
        blessed($_) and $_->isa('AAA') for @vals;
    },
    is_instance => sub {
        is_instance($_, 'AAA') for @vals;
    },
    _INSTANCE => sub {
        _INSTANCE($_, 'AAA') for @vals;
    },
    '$_isa' => sub {
        $_->$_isa('AAA') for @vals;
    },
    is_blessed_ref => sub {
        is_blessed_ref($_) and $_->isa('AAA') for @vals;
    },
});

say "";
say "--> bless されているか判定";
cmpthese($count, {
    blessed => sub {
        blessed($_) for @vals;
    },
    is_blessed_ref => sub {
        is_blessed_ref($_) for @vals;
    },
});

__END__

% perl benchmark/blessed.pl
--> isa 判定
                    Rate     $_isa _INSTANCE  blessed is_instance is_blessed_ref
$_isa           328504/s        --      -51%     -68%        -82%           -83%
_INSTANCE       672289/s      105%        --     -34%        -62%           -65%
blessed        1013874/s      209%       51%       --        -43%           -48%
is_instance    1789569/s      445%      166%      77%          --            -8%
is_blessed_ref 1936331/s      489%      188%      91%          8%             --

--> bless されているか判定
                    Rate        blessed is_blessed_ref
blessed        1626881/s             --           -71%
is_blessed_ref 5694085/s           250%             --

% perl -v | head -2

This is perl 5, version 28, subversion 2 (v5.28.2) built for amd64-freebsd-thread-multi
perl adv
perl adv