Использование использовать 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. У меня такая же проблема, если это в файле, а не один лайнер в командной строке.

578   6  

6 ответов:

без use utf8 на Perl интерпретирует строку как последовательность однобайтовых символов. В вашей строке есть четыре байта, как вы можете видеть из этого:

$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10

первые три байта составляют ваш символ,последний-это линия подачи.

вызов print отправляет эти четыре символа в STDOUT. Затем консоль определяет, как отображать эти символы. Если ваша консоль настроена на использование UTF8, то она будет интерпретировать эти три байта как ваш единственный характер и это то, что отображается.

если мы добавим в тег 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)';

кодирует все стандартные выходные данные как UTF-8:

binmode STDOUT, ":utf8";

вы можете приблизиться к "просто сделать utf8 везде" с помощью модуля CPAN utf8::all.

perl -Mutf8::all -e 'print "鸡\n";'

, когда print получает что-то, что он не может напечатать (символ больше 255, когда нет :encoding слой предоставляется), он предполагает, что вы хотели кодировать его с помощью UTF-8. Он делает это, предупредив о проблеме.

вы можете использовать это,

perl -CS filename.

Он также завершает эту ошибку.

на испанском языке вы можете найти эту ошибку, когда рядом с началом использования:

use utf8;

кодировка вашего редактора находится в другой кодировке. Так что то, что вы видите в редакторе, это не то, что делает Perl. Чтобы решить эту ошибку, просто измените кодировку редактора на Unicode / UTF-8.

Comments

    Ничего не найдено.