Wenn ich das folgende Perl-Programm ausführe:
perl -e 'use utf8; print "鸡\n";'
Ich bekomme diese Warnung:
Wide character in print at -e line 1.
Wenn ich dieses Perl-Programm ausführe:
perl -e 'print "鸡\n";'
Ich bekomme keine Warnung.
Ich dachte, es use utf8
sei erforderlich, UTF-8-Zeichen in einem Perl-Skript zu verwenden. Warum funktioniert das nicht und wie kann ich es beheben? Ich benutze Perl 5.16.2. Ich habe das gleiche Problem, wenn dies in einer Datei ist, anstatt ein Einzeiler in der Befehlszeile zu sein.
binmode
mit der richtigen Codierung ... albertech.blogspot.com/2017/04/…Antworten:
Ohne
use utf8
Perl wird Ihre Zeichenfolge als Folge von Einzelbytezeichen interpretiert. Ihre Zeichenfolge enthält vier Bytes, wie Sie sehen können:Die ersten drei Bytes bilden Ihren Charakter, das letzte ist der Zeilenvorschub.
Der Aufruf
print
zum Senden dieser vier Zeichen an STDOUT. Ihre Konsole ermittelt dann, wie diese Zeichen angezeigt werden. Wenn Ihre Konsole auf UTF8 eingestellt ist, interpretiert sie diese drei Bytes als Ihr einzelnes Zeichen, und das wird angezeigt.Wenn wir das
utf8
Modul hinzufügen , sind die Dinge anders. In diesem Fall interpretiert Perl Ihre Zeichenfolge als nur zwei Zeichen.Standardmäßig geht die E / A-Ebene von Perl davon aus, dass sie mit Einzelbyte-Zeichen arbeitet. Wenn Sie also versuchen, ein Multi-Byte-Zeichen zu drucken, denkt Perl, dass etwas nicht stimmt, und gibt Ihnen eine Warnung aus. Wie immer können Sie weitere Erklärungen für diesen Fehler erhalten, indem Sie einschließen
use diagnostics
. Es wird folgendes sagen:Wie andere bereits betont haben, müssen Sie Perl anweisen, eine Mehrbyte-Ausgabe zu akzeptieren. Es gibt viele Möglichkeiten, dies zu tun ( einige Beispiele finden Sie im Perl Unicode-Tutorial ). Eine der einfachsten Möglichkeiten ist die Verwendung des
-CS
Befehlszeilenflags, mit dem die drei Standard-Dateihandles (STDIN, STDOUT und STDERR) angewiesen werden, mit UTF8 umzugehen.vs.
Unicode ist ein großer und komplexer Bereich. Wie Sie gesehen haben, scheinen viele einfache Programme das Richtige zu tun, aber aus den falschen Gründen. Wenn Sie anfangen, einen Teil des Programms zu reparieren, wird es oft schlimmer, bis Sie das gesamte Programm repariert haben .
quelle
-Mutf8
wenn nicht in einem Liner Perl?use utf8;
Sie
use utf8;
müssen Perl lediglich mitteilen, dass der Quellcode mit UTF-8 codiert ist. Sie müssen Perl mitteilen, wie Sie Ihren Text codieren sollen:quelle
Codieren Sie alle Standardausgaben als UTF-8:
quelle
use open ':std', ':encoding(UTF-8)';
Wie in einer anderen Antwort vorgeschlagen, gilt dies für STDOUT, markiert jedoch auch STDERR und STDIN als UTF-8, sodass Sie drei für den Preis einer Anweisung erhalten. Siehe auch stackoverflow.com/a/42194059Mit dem CPAN-Modul können Sie sich "einfach überall utf8 machen" nähern
utf8::all
.Wenn
print
etwas empfangen wird, das nicht gedruckt werden kann (Zeichen größer als 255, wenn keine:encoding
Ebene bereitgestellt wird), wird davon ausgegangen, dass Sie es mit UTF-8 codieren möchten. Dies geschieht nach Warnung vor dem Problem.quelle
Sie können dies verwenden,
Dieser Fehler wird ebenfalls beendet.
quelle
Auf Spanisch können Sie diesen Fehler finden, wenn Sie neben der Verwendung beginnen:
Ihre Editor-Codierung hat eine andere Codierung. Was Sie also im Editor sehen, ist nicht das, was Perl tut. Um diesen Fehler zu beheben, ändern Sie einfach die Editor-Codierung in Unicode / UTF-8 .
quelle