use utf8
Perl olmadan , dizenizi tek baytlık karakterler dizisi olarak yorumlar. Bundan da görebileceğiniz gibi dizenizde dört bayt vardır:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
İlk üç bayt karakterinizi oluşturur, sonuncusu satır beslemesidir.
Çağrı, print
bu dört karakteri STDOUT'a gönderir. Konsolunuz daha sonra bu karakterlerin nasıl görüntüleneceğini hesaplar. Konsolunuz UTF8 kullanacak şekilde ayarlanmışsa, bu üç baytı tek karakteriniz olarak yorumlayacaktır ve görüntülenen budur.
utf8
Modüle eklersek , işler farklıdır. Bu durumda Perl, dizenizi sadece iki karakter olarak yorumlar.
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
Varsayılan olarak, Perl'in GÇ katmanı tek baytlık karakterlerle çalıştığını varsayar. Bu yüzden çok baytlı bir karakter yazdırmaya çalıştığınızda Perl bir şeylerin yanlış olduğunu düşünür ve sizi uyarır. Her zamanki gibi, ekleyerek bu hata için daha fazla açıklama alabilirsiniz use diagnostics
. Bunu söyleyecek:
(S utf8) Perl, beklemediği bir zamanda geniş bir karakterle (> 255) karşılaştı. Bu uyarı varsayılan olarak G / Ç için açıktır (yazdırma gibi). Bu uyarıyı susturmanın en kolay yolu çıktıya: utf8 katmanını eklemektir, örneğin binmode STDOUT, ': utf8'. Uyarıyı kapatmanın bir başka yolu da uyarı eklememektir 'utf8'; ama bu genellikle hile yapmaya daha yakındır. Genel olarak, dosya tanıtıcısını bir kodlama ile açıkça işaretlemeniz gerekir, bkz. Open ve perlfunc / binmode.
Diğerlerinin de belirttiği gibi, Perl'e çok baytlı çıktıyı kabul etmesini söylemeniz gerekir. Bunu yapmanın birçok yolu vardır ( bazı örnekler için Perl Unicode Eğitimine bakın). En basit yollardan biri -CS
, üç standart dosya tanıtıcısına (STDIN, STDOUT ve STDERR) UTF8 ile ilgilenmesini söyleyen komut satırı bayrağını kullanmaktır .
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
vs
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
Unicode, büyük ve karmaşık bir alandır. Gördüğünüz gibi, birçok basit program doğru şeyi yapıyor gibi görünüyor, ancak yanlış nedenlerle. Programın düzeltme kısmına başladığınızda size giderdikten kadar, işler çoğu zaman kötüye gidecek tüm programın.