Ответ 1
Следующая программа производит правильный вывод:
use utf8;
use strict;
use warnings;
use warnings qw(FATAL utf8);
binmode(STDOUT, ":unix:encoding(utf8):crlf");
print 'αβγxyz', "\n";
Вывод:
C:\…> chcp 65001 Active code page: 65001 C:\…> perl pttt.pl αβγxyz
который, по-видимому, указывает мне, что есть некоторая забава с слоем :crlf
. Я не понимаю, что внутренности достаточно, чтобы комментировать разумно об этом в этот момент.
После многих экспериментов я пришел к выводу, что если консоль уже установлена на кодовую страницу 65001, binmode(STDOUT, ":unix:encoding(utf8):crlf");
будет работать. Однако обратите внимание на следующее:
binmode(STDOUT, ":unix:encoding(utf8):crlf");
print Dump [
map {
my $x = defined($_) ? $_ : '';
$x =~ s/\A([0-9]+)\z/sprintf '0x%08x', $1/eg;
$x;
} PerlIO::get_layers(STDOUT, details => 1)
];
print "αβγxyz\n";
дает мне:
--- - unix - '' - 0x01205200 - crlf - '' - 0x00c85200 - unix - '' - 0x01201200 - encoding - utf8 - 0x00c89200 - crlf - '' - 0x00c8d200 αβγxyz
Как и прежде, я не знаю достаточно, чтобы знать все последствия этого. В какой-то момент я намерен построить отладчик perl
, чтобы продолжить диагностику.
I рассмотрел это немного дальше. Вот некоторые замечания из этого сообщения:
Флагов для первого слоя unix
являются 0x01205200 = CANWRITE | TRUNCATE | CRLF | OPEN | NOTREG
. Почему CRLF
установлен для слоя unix
в Windows? Я не знаю, что такое внутренности, чтобы понять это.
Однако флаги для второго слоя unix
, который был нажат моим явным binmode
, равны 0x01201200 = 0x01205200 и ~ CRLF. Это то, что имело бы смысл для меня начать.
Флаги для первого слоя crlf 0x00c85200 = CANWRITE | TRUNCATE | CRLF | LINEBUF | FASTGETS | TTY
. Флаги для второго layer
, который я нажимаю после слоя :encoding(utf8)
, 0x00c8d200 = 0x00c85200 | UTF8
.
Теперь, если я открою файл с помощью open my $fh, '>:encoding(utf8)', 'ttt'
и выгружу ту же информацию, я получаю:
--- - unix - '' - 0x00201200 - crlf - '' - 0x00405200 - encoding - utf8 - 0x00409200
Как и ожидалось, слой unix
не устанавливает флаг CRLF
.