Как мне найти "широкие символы", напечатанные на Perl? - PullRequest
2 голосов
/ 29 июля 2010

Скрипт perl, который удаляет статические html-страницы с веб-сайта и записывает их в отдельные файлы, работает, но также печатает множество экземпляров wide character in print at ./script.pl line n на консоли: по одному для каждой страницы.

Однако,Краткий взгляд на созданные html-файлы не выявил каких-либо очевидных ошибок в процессе очистки.Как я могу найти / исправить проблему персонажа (ов)?Должен ли я вообще позаботиться об этом?

Соответствующий код:

use WWW::Mechanize;
my $mech = WWW::Mechanize->new;   
...
foreach (@urls) {
    $mech->get($_); 
    print FILE $mech->content;  #MESSAGE REFERS TO THIS LINE
...

Это на OSX с Perl 5.8.8.

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Если вы хотите исправить файлы после факта, то вы можете передать их через fix_latin , чтобы убедиться, что все они в формате UTF-8 (при условии, что входные данные представляют собой смесь ASCII, Latin -1, CP1252 или UTF-8 уже).

В будущем вы можете использовать $mech->response->decoded_content, который должен давать вам UTF-8 независимо от того, какую кодировку использует веб-сервер. Вы должны binmode(FILE, ':utf8') перед записью в него, чтобы гарантировать, что внутреннее строковое представление Perl будет преобразовано в строгие байты UTF-8 при выводе.

2 голосов
/ 29 июля 2010

Я предполагаю, что вы сканируете изображения или что-то в этом роде, в любом случае вы можете обойти проблему, добавив binmode(FILE); или, если это веб-страницы и UTF-8, попробуйте binmode( FILE, ':utf8' ). См. perldoc -f binmode, perldoc perlopentut и perldoc PerlIO для получения дополнительной информации ..

": bytes", ": crlf" и ": utf8" и любые другие директивы вида ": ..." называются уровнями ввода / вывода. «Открытая» прагма может использоваться для установки уровней ввода / вывода по умолчанию. Смотри открыто.

Чтобы отметить FILEHANDLE как UTF-8, используйте ": utf8" или ": encoding (utf8)". «: utf8» просто помечает данные как UTF-8 без дальнейшей проверки, в то время как «: encoding (utf8)» проверяет данные как фактические действующий UTF-8. Более подробную информацию можно найти в PerlIO :: encoding.

...