Вот два примера, которые помогут вам понять ошибки:
milu@ubuntu: ~/Milu/Dev/Perl > cat malformed-utf8-char.pl
use utf8; # script source must be in UTF-8
use strict;
use warnings;
print "K�se\n";
milu@ubuntu: ~/Milu/Dev/Perl > perl malformed-utf8-char.pl
Malformed UTF-8 character (unexpected non-continuation byte 0x73,
immediately after start byte 0xe4) at malformed-utf8-char.pl line 4.
Kse
Источник на латинице-1, мой терминал в UTF-8.Строка на самом деле "Käse".Прагма utf8
должна быть либо удалена, либо источник должен быть сохранен в UTF-8.
milu@ubuntu: ~/Milu/Dev/Perl > cat wide-char-in-print.pl
use utf8;
use strict;
use warnings;
# binmode STDOUT, ':utf8';
print "Группа сайтов РИА Новости\n";
milu@ubuntu: ~/Milu/Dev/Perl > perl wide-char-in-print.pl
Wide character in print at wide-char-in-print.pl line 5.
Группа сайтов РИА Новости
Источник содержит символы кириллицы, поэтому прагма utf8
находится в порядке.Однако для печати этих символов в терминал необходимо также установить STDOUT
в UTF-8, чего можно добиться, вызвав binmode
.Если вы этого не сделаете, предупреждение сработает, поскольку широкий (Unicode за 0x255) символ не проходит через узкий (байтовый) выходной канал.Он все равно будет выглядеть правильно, потому что Perl будет просто выводить байты такими, какие они есть, и тогда это выглядит правильно.