Das ist nicht richtig. Ruby unterscheidet auch bei I/O zwischen den Encodings, und auch Perl tut das. Oder was meinst du, wofür
open(my $fh, "<:encoding(UTF-8)", "filename") || die "can't open UTF-8 encoded filename: $!";
das
UTF-8
hier steht?
Es sorgt dafür, dass am IO Layer von Character- auf Byte-Semantic umgeschaltet wird. Sicher gabs auch in Perl wesentliche Änderungen, bsp. ist mit 5.8 Encode in den Core gekommen und die Unicode-Unterstützung wird ständig verbessert.
Aber IO (Sockets, Dateihandle, STDIN, STDOUT...) war schon immer Byte-Semantic und auf diesem Level gibt es keine Kodierung.
So gibt ein print "äöü" nicht etwa Zeichen aus sondern Bytes und zwar genauso, wie sie in derselben Datei gespeichert sind.
Ob das Bytes für UTF-8 sind oder ISO/ANSI-irgendwas ist dem Perl-Interpreter oder einem c-Compiler völlig Wurscht.