Tanpa use utf8
Perl menafsirkan string Anda sebagai urutan karakter byte tunggal. Ada empat byte dalam string Anda seperti yang Anda lihat dari ini:
$ perl -E 'say join ":", map { ord } split //, "鸡\n";'
233:184:161:10
Tiga byte pertama membentuk karakter Anda, yang terakhir adalah feed baris.
Panggilan untuk print
mengirimkan empat karakter ini ke STDOUT. Konsol Anda kemudian mengetahui cara menampilkan karakter ini. Jika konsol Anda disetel untuk menggunakan UTF8, maka tiga byte tersebut akan ditafsirkan sebagai karakter tunggal Anda dan itulah yang ditampilkan.
Jika kita menambahkan utf8
modul, semuanya berbeda. Dalam hal ini, Perl menafsirkan string Anda hanya sebagai dua karakter.
$ perl -Mutf8 -E 'say join ":", map { ord } split //, "鸡\n";'
40481:10
Secara default, lapisan IO Perl mengasumsikan bahwa ia bekerja dengan karakter byte tunggal. Jadi ketika Anda mencoba untuk mencetak karakter multi-byte, Perl berpikir ada sesuatu yang salah dan memberi Anda peringatan. Seperti biasa, Anda bisa mendapatkan lebih banyak penjelasan untuk kesalahan ini dengan menyertakan use diagnostics
. Ini akan mengatakan ini:
(S utf8) Perl bertemu dengan karakter yang luas (> 255) ketika tidak diharapkan. Peringatan ini secara default aktif untuk I / O (seperti cetakan). Cara termudah untuk menghentikan peringatan ini adalah dengan menambahkan lapisan: utf8 ke keluaran, misalnya binmode STDOUT, ': utf8'. Cara lain untuk mematikan peringatan adalah dengan tidak menambahkan peringatan 'utf8'; tetapi itu sering kali lebih mendekati kecurangan. Secara umum, Anda seharusnya menandai filehandle secara eksplisit dengan sebuah encoding, lihat open dan perlfunc / binmode.
Seperti yang ditunjukkan orang lain, Anda perlu memberi tahu Perl untuk menerima keluaran multi-byte. Ada banyak cara untuk melakukan ini (lihat Tutorial Perl Unicode untuk beberapa contoh). Salah satu cara paling sederhana adalah dengan menggunakan tanda -CS
baris perintah - yang memberi tahu tiga penanganan file standar (STDIN, STDOUT dan STDERR) untuk menangani UTF8.
$ perl -Mutf8 -e 'print "鸡\n";'
Wide character in print at -e line 1.
鸡
vs.
$ perl -Mutf8 -CS -e 'print "鸡\n";'
鸡
Unicode adalah area yang besar dan kompleks. Seperti yang Anda lihat, banyak program sederhana tampaknya melakukan hal yang benar, tetapi untuk alasan yang salah. Ketika Anda mulai memperbaiki bagian dari program, keadaan akan sering menjadi lebih buruk sampai Anda telah memperbaiki semua program.