Ohne use utf8
Perl wird Ihre Zeichenfolge als Folge von Einzelbytezeichen interpretiert. Ihre Zeichenfolge enthält vier Bytes, wie Sie sehen können:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
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.
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
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:
(S utf8) Perl traf einen breiten Charakter (> 255), als er keinen erwartete. Diese Warnung ist standardmäßig für E / A aktiviert (wie Drucken). Der einfachste Weg, diese Warnung zu beruhigen, besteht darin, der Ausgabe die Ebene: utf8 hinzuzufügen, z. B. binmode STDOUT, ': utf8'. Eine andere Möglichkeit, die Warnung auszuschalten, besteht darin, keine Warnungen 'utf8' hinzuzufügen. aber das ist oft näher am betrügen. Im Allgemeinen sollten Sie das Dateihandle explizit mit einer Codierung markieren, siehe open und perlfunc / binmode.
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.
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
vs.
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
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 .