Как я подавляю предупреждения UTF-8 в Perl? - PullRequest
8 голосов
/ 03 июня 2011

По разным причинам я получаю сообщения об ошибках Malformed UTF-8 character и Wide character in print из старого скрипта.

Я хотел бы подавить / отключить эти два предупреждения, чтобы они не записывались в STDERR.

Как мне это сделать?

Ответы [ 4 ]

12 голосов
/ 03 июня 2011

Предположительно, вы работаете в utf8.Вы должны включить обработку utf8 для каждого дескриптора файла.

binmode STDERR, ":encoding(utf8)";

Вы можете сделать это для всех стандартных дескрипторов с помощью use open ":encoding(utf8)".См. open для получения дополнительной информации.

Наконец, вы можете utf8-ify все, ваш код, ваши файловые дескрипторы и ваши аргументы, используя utf8 :: all .

Обратите внимание , что :utf8 включает обработку utf8, но :encoding(utf8) проверяет, что данные действительны utf8, поэтому они безопаснее.Подробнее см. perldoc -f binmode.

8 голосов
/ 03 июня 2011
no warnings 'utf8';

Но лучше всего выяснить, почему вы получаете предупреждение, и решить основную проблему. Эти два предупреждения указывают, что что-то идет не так в вашем сценарии. Подавление предупреждений не исправит ошибку.

5 голосов
/ 03 июня 2011

Вот два примера, которые помогут вам понять ошибки:

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 будет просто выводить байты такими, какие они есть, и тогда это выглядит правильно.

2 голосов
/ 03 ноября 2013

Была такая же проблема с отладочным выводом из log4perl с использованием Perl на Windows Powershell Console

Wide character in print at C:/strawberry/perl/site/lib/Log/Log4perl/Appender/Screen.pm line 39.

Решения были (в файле конфигурации log4perl)

log4perl.appender.Screen.utf8 = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...