Использование использовать utf8;' дает мне 'широкий характер в печати
если я запускаю следующую программу Perl:
perl -e 'use utf8; print "鸡n";'
Я получаю это предупреждение:
Wide character in print at -e line 1.
если я запускаю эту программу Perl:
perl -e 'print "鸡n";'
Я не получаю предупреждение.
Я думал use utf8 требуется использовать символы UTF-8 в скрипте Perl. Почему это не работает и как я могу это исправить? Я использую Perl 5.16.2. У меня такая же проблема, если это в файле, а не один лайнер в командной строке.
6 ответов:
без
use utf8на Perl интерпретирует строку как последовательность однобайтовых символов. В вашей строке есть четыре байта, как вы можете видеть из этого:$ perl -E 'say join ":", map { ord } split //, "鸡\n";' 233:184:161:10первые три байта составляют ваш символ,последний-это линия подачи.
вызов
если мы добавим в тег
utf8модуль, все по-другому. В этом случае Perl интерпретирует вашу строку как всего два символа.$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";' 40481:10по умолчанию уровень ввода-вывода Perl предполагает, что он работает с однобайтовыми символами. Поэтому, когда вы пытаетесь напечатать многобайтовый символ, Perl думает, что что-то не так, и дает вам предупреждение. Как всегда, вы можете получить больше объяснений этой ошибки, включив
use diagnostics. Он скажет: это:(s utf8) Perl встретил широкий символ (>255), когда он не ожидал один. Это предупреждение по умолчанию для ввода/вывода (например, печать). Самый простой способ успокоить это предупреждение-просто добавить слой: utf8 к вывод, например binmode STDOUT,': utf8'. Еще один способ отключить предупреждение состоит в том, чтобы не добавлять никаких предупреждений "utf8"; но это часто ближе к мошенничество. В общем, вы должны четко обозначить файловый хэндл с кодировкой, см. раздел открыть и perlfunc/binmode.
как указывали другие, вам нужно сказать Perl, чтобы принять многобайтовый вывод. Есть много способов сделать это (см. Perl Unicode Tutorial для некоторых примеров). Одним из самых простых способов является использование
-CSфлаг командной строки-который сообщает три стандартных файловых хэндла (STDIN, STDOUT и STDERR) для работы с UTF8.$ perl -Mutf8 -e 'print "鸡\n";' Wide character in print at -e line 1. 鸡vs
$ perl -Mutf8 -CS -e 'print "鸡\n";' 鸡Unicode-это большая и сложная область. Как вы уже видели, многие простые программы, кажется, делают правильные вещи, но по неправильным причинам. Когда вы начинаете исправлять часть программы, все будет часто ухудшаться, пока вы не исправите все программы.
все
use utf8;это говорит Perl исходный код кодируется с помощью UTF-8. Вам нужно рассказать Perl, как кодировать ваш текст:use open ':std', ':encoding(UTF-8)';
вы можете приблизиться к "просто сделать utf8 везде" с помощью модуля CPAN
utf8::all.perl -Mutf8::all -e 'print "鸡\n";', когда
:encodingслой предоставляется), он предполагает, что вы хотели кодировать его с помощью UTF-8. Он делает это, предупредив о проблеме.
на испанском языке вы можете найти эту ошибку, когда рядом с началом использования:
use utf8;кодировка вашего редактора находится в другой кодировке. Так что то, что вы видите в редакторе, это не то, что делает Perl. Чтобы решить эту ошибку, просто измените кодировку редактора на Unicode / UTF-8.
Comments