Ini adalah perintah perluniintro yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, Windows online emulator atau MAC OS online emulator
PROGRAM:
NAMA
perluniintro - Perl Unicode pengenalan
DESKRIPSI
Dokumen ini memberikan gambaran umum tentang Unicode dan cara menggunakan Unicode di Perl. Melihat
"Sumber Daya Lebih Lanjut" untuk referensi ke perawatan Unicode yang lebih mendalam.
Unicode
Unicode adalah standar set karakter yang berencana untuk mengkodifikasi semua sistem penulisan
dunia, ditambah banyak simbol lainnya.
Unicode dan ISO/IEC 10646 adalah standar terkoordinasi yang menyatukan hampir semua modern lainnya
standar set karakter, mencakup lebih dari 80 sistem penulisan dan ratusan bahasa,
termasuk semua bahasa modern yang penting secara komersial. Semua karakter dalam yang terbesar
Kamus Cina, Jepang, dan Korea juga dikodekan. Standar pada akhirnya akan
mencakup hampir semua karakter dalam lebih dari 250 sistem penulisan dan ribuan bahasa.
Unicode 1.0 dirilis pada Oktober 1991, dan 6.0 pada Oktober 2010.
Sebuah Unicode karakter adalah entitas abstrak. Itu tidak terikat pada bilangan bulat tertentu
lebar, terutama untuk bahasa C "char". Unicode adalah bahasa-netral dan tampilan-
netral: itu tidak menyandikan bahasa teks, dan umumnya tidak mendefinisikan
font atau detail tata letak grafis lainnya. Unicode beroperasi pada karakter dan pada teks yang dibangun
dari karakter-karakter tersebut.
Unicode mendefinisikan karakter seperti "LATIN CAPITAL LETTER A" atau "GREEK SMALL LETTER ALPHA" dan
nomor unik untuk karakter, dalam hal ini 0x0041 dan 0x03B1, masing-masing. Ini
bilangan unik disebut kode poin. Titik kode pada dasarnya adalah posisi
karakter dalam himpunan semua karakter Unicode yang mungkin, dan dengan demikian di Perl, istilah
urut sering digunakan secara bergantian dengannya.
Standar Unicode lebih suka menggunakan notasi heksadesimal untuk poin kode. Jika angka
seperti 0x0041 yang tidak Anda kenal, lihat bagian selanjutnya, "Notasi Heksadesimal".
Standar Unicode menggunakan notasi "U+0041 LATIN CAPITAL LETTER A", untuk memberikan
titik kode heksadesimal dan nama normatif karakter.
Unicode juga mendefinisikan berbagai properties untuk karakter, seperti "huruf besar" atau
"huruf kecil", "digit desimal", atau "tanda baca"; sifat-sifat ini tidak bergantung pada
nama-nama karakter. Selanjutnya, berbagai operasi pada karakter seperti
huruf besar, huruf kecil, dan susunan (sorting) didefinisikan.
Sebuah Unicode logis "karakter" sebenarnya dapat terdiri dari lebih dari satu internal sebenarnya
"karakter" atau titik kode. Untuk bahasa Barat, ini cukup dimodelkan oleh a mendasarkan
karakter (seperti "HURUF MODAL LATIN A") diikuti oleh satu atau lebih pengubah (seperti
"MENGABUNGKAN AKSEN AKUT"). Urutan karakter dasar dan pengubah ini disebut a
menggabungkan karakter urutan. Beberapa bahasa non-Barat memerlukan model yang lebih rumit,
jadi Unicode menciptakan grafem kelompok konsep, yang kemudian disempurnakan lebih lanjut menjadi
luas grafem kelompok. Misalnya, suku kata Hangul Korea dianggap tunggal
karakter logis, tetapi paling sering terdiri dari tiga karakter Unicode yang sebenarnya: a leading
konsonan diikuti oleh vokal interior diikuti oleh konsonan tambahan.
Apakah akan menyebut kluster grafem yang diperluas ini sebagai "karakter" tergantung pada sudut pandang Anda
melihat. Jika Anda seorang programmer, Anda mungkin cenderung melihat setiap elemen di
urutan sebagai satu unit, atau "karakter". Namun dari sudut pandang pengguna, keseluruhan
urutan dapat dilihat sebagai satu "karakter" karena mungkin seperti itulah yang terlihat di
konteks bahasa pengguna. Dalam dokumen ini, kami mengambil sudut pandang programmer:
satu "karakter" adalah satu titik kode Unicode.
Untuk beberapa kombinasi karakter dasar dan modifier, ada sudah disusun sebelumnya karakter.
Ada satu karakter yang setara, misalnya, untuk urutan "KAPITAL LATIN
HURUF A" diikuti dengan "MENGABUNGKAN AKSEN AKUT" disebut "HURUF KAPITAL LATIN A
WITH ACUTE". Namun, karakter yang telah dibuat sebelumnya ini hanya tersedia untuk beberapa
kombinasi, dan terutama dimaksudkan untuk mendukung konversi pulang pergi antara Unicode dan
standar warisan (seperti ISO 8859). Menggunakan urutan, seperti yang dilakukan Unicode, memungkinkan untuk membutuhkan
lebih sedikit blok bangunan dasar (poin kode) untuk mengekspresikan lebih banyak grafem potensial
cluster. Untuk mendukung konversi antara bentuk yang setara, berbagai normalisasi bentuk adalah
juga didefinisikan. Jadi, "Huruf Kapital LATIN A DENGAN AKUT" ada di Normalisasi Bentuk
Tersusun, (disingkat NFC), dan urutan "Huruf Kapital LATIN A" diikuti oleh
"COMBINING ACUTE ACCENT" mewakili karakter yang sama di Normalisasi Bentuk Terurai
(NFD).
Karena kompatibilitas mundur dengan pengkodean lama, "nomor unik untuk setiap"
ide karakter" sedikit rusak: sebagai gantinya, ada "setidaknya satu nomor untuk setiap
karakter". Karakter yang sama dapat direpresentasikan secara berbeda dalam beberapa warisan
pengkodean. Kebalikannya tidak benar: beberapa poin kode tidak memiliki karakter yang ditetapkan.
Pertama, ada poin kode yang tidak terisi di dalam blok yang digunakan. Kedua, ada
adalah karakter kontrol Unicode khusus yang tidak mewakili karakter sebenarnya.
Ketika Unicode pertama kali dikandung, diperkirakan bahwa semua karakter dunia bisa menjadi
diwakili menggunakan kata 16-bit; itu adalah maksimum 0x10000 (atau 65,536) karakter akan
dibutuhkan, dari 0x0000 hingga 0xFFFF. Ini segera terbukti salah, dan sejak Unicode 2.0
(Juli 1996), Unicode telah didefinisikan hingga 21 bit (0x10FFFF), dan Unicode
3.1 (Maret 2001) mendefinisikan karakter pertama di atas 0xFFFF. 0x10000 karakter pertama
disebut Pesawat 0, Atau Dasar Multilingual Pesawat (BMP). Dengan Unicode 3.1, 17 (ya,
tujuh belas) pesawat secara keseluruhan telah ditentukan--tetapi mereka sama sekali tidak sepenuhnya ditentukan
karakter, belum.
Ketika bahasa baru sedang dikodekan, Unicode umumnya akan memilih "blok" dari
poin kode yang tidak terisi berturut-turut untuk karakternya. Sejauh ini, jumlah poin kode
di blok ini selalu habis dibagi 16. Ekstra di blok, tidak saat ini
dibutuhkan, dibiarkan tidak dialokasikan, untuk pertumbuhan di masa depan. Tetapi ada saat-saat ketika
rilis selanjutnya membutuhkan lebih banyak poin kode daripada ekstra yang tersedia, dan blok baru harus
dialokasikan di tempat lain, tidak bersebelahan dengan yang awal, untuk menangani overflow.
Dengan demikian, menjadi jelas sejak awal bahwa "blok" bukanlah prinsip pengorganisasian yang memadai,
dan properti "Script" dibuat. (Kemudian properti skrip yang ditingkatkan ditambahkan sebagai
baik, properti "Script_Extensions".) Poin kode yang ada di blok overflow
masih dapat memiliki skrip yang sama dengan yang asli. Konsep skrip lebih cocok
dengan bahasa alami: ada skrip "Latin", skrip "Yunani", dan seterusnya; dan ada
beberapa skrip buatan, seperti "Umum" untuk karakter yang digunakan dalam banyak
skrip, seperti simbol matematika. Skrip biasanya menjangkau berbagai bagian dari beberapa
blok. Untuk informasi lebih lanjut tentang skrip, lihat "Skrip" di perlunicode. Divisi
menjadi blok ada, tetapi hampir sepenuhnya tidak disengaja--sebuah artefak tentang bagaimana
karakter telah dan masih dialokasikan. (Perhatikan bahwa paragraf ini memiliki
hal-hal yang terlalu disederhanakan demi ini menjadi pengantar. Unicode tidak benar-benar
menyandikan bahasa, tetapi sistem penulisan untuk mereka—skrip mereka; dan satu skrip bisa
digunakan oleh banyak bahasa. Unicode juga mengkodekan hal-hal yang sebenarnya bukan tentang bahasa,
seperti simbol seperti "KLAIM BAGASI".)
Poin kode Unicode hanyalah angka abstrak. Untuk memasukkan dan mengeluarkan abstrak ini
angka, angkanya harus dikodekan or serial bagaimanapun. Unicode mendefinisikan beberapa
karakter encoding bentuk, Yang UTF-8 adalah yang paling populer. UTF-8 adalah panjang variabel
encoding yang mengkodekan karakter Unicode sebagai 1 hingga 4 byte. Pengkodean lainnya termasuk UTF-16
dan UTF-32 serta varian big-endian dan little-endiannya (UTF-8 tidak bergantung pada urutan byte).
ISO/IEC 10646 mendefinisikan bentuk pengkodean UCS-2 dan UCS-4.
Untuk informasi lebih lanjut tentang penyandian--misalnya, untuk mempelajari apa pengganti dan byte
urutan tanda (BOM) adalah--lihat perlunicode.
Perl's Unicode Bantuan
Mulai dari Perl v5.6.0, Perl telah memiliki kapasitas untuk menangani Unicode secara native. Perl
v5.8.0, bagaimanapun, adalah rilis pertama yang direkomendasikan untuk pekerjaan Unicode yang serius. Itu
rilis pemeliharaan 5.6.1 memperbaiki banyak masalah Unicode awal
implementasi, tetapi misalnya ekspresi reguler masih tidak berfungsi dengan Unicode di
5.6.1. Perl v5.14.0 adalah rilis pertama di mana dukungan Unicode (hampir) mulus
terintegrasi tanpa beberapa gotcha (pengecualian menjadi beberapa perbedaan dalam quotemeta, dan
yang diperbaiki mulai dari Perl 5.16.0). Untuk mengaktifkan dukungan tanpa batas ini, Anda harus "menggunakan
fitur 'unicode_strings'" (yang secara otomatis dipilih jika Anda "menggunakan 5.012" atau lebih tinggi).
Lihat fitur. (5.14 juga memperbaiki sejumlah bug dan penyimpangan dari standar Unicode.)
Sebelum Perl v5.8.0, penggunaan "use utf8" digunakan untuk menyatakan bahwa operasi di
blok atau file saat ini akan menjadi Unicode-aware. Model ini ternyata salah, atau
paling tidak canggung: "Unicodeness" sekarang dibawa dengan data, bukannya dilampirkan ke
operasi. Dimulai dengan Perl v5.8.0, hanya satu kasus yang tersisa di mana "penggunaan" eksplisit
utf8" diperlukan: jika skrip Perl Anda sendiri dikodekan dalam UTF-8, Anda dapat menggunakan UTF-8 di
nama pengenal, dan dalam string dan literal ekspresi reguler, dengan mengatakan "gunakan utf8".
Ini bukan default karena skrip dengan data 8-bit lama di dalamnya akan rusak. Melihat
utf8.
Perl's Unicode Model
Perl mendukung string pra-5.6 byte asli delapan bit, dan string Unicode
karakter. Prinsip umumnya adalah Perl mencoba menyimpan datanya sebagai byte delapan bit
selama mungkin, tetapi segera setelah Unicodeness tidak dapat dihindari, datanya adalah
ditingkatkan secara transparan ke Unicode. Sebelum Perl v5.14.0, peningkatannya tidak sepenuhnya
transparan (lihat "Bug Unicode"" di perlunicode), dan untuk kompatibilitas mundur,
transparansi penuh tidak diperoleh kecuali "gunakan fitur 'unicode_strings'" (lihat fitur) atau
"gunakan 5.012" (atau lebih tinggi) dipilih.
Secara internal, Perl saat ini menggunakan set karakter delapan bit asli apa pun dari
platform (misalnya Latin-1) adalah, default ke UTF-8, untuk mengkodekan string Unicode.
Secara khusus, jika semua titik kode dalam string adalah 0xFF atau kurang, Perl menggunakan yang asli
set karakter delapan bit. Jika tidak, ia menggunakan UTF-8.
Pengguna Perl biasanya tidak perlu tahu atau peduli bagaimana Perl mengkodekannya
string internal, tetapi menjadi relevan saat mengeluarkan string Unicode ke aliran
tanpa lapisan PerlIO (satu dengan penyandian "default"). Dalam kasus seperti itu, byte mentah
digunakan secara internal (set karakter asli atau UTF-8, yang sesuai untuk setiap string) akan
digunakan, dan peringatan "Karakter lebar" akan dikeluarkan jika string tersebut berisi a
karakter di luar 0x00FF.
Sebagai contoh,
perl -e 'print "\x{DF}\n", "\x{0100}\x{DF}\n"'
menghasilkan campuran byte asli dan UTF-8 yang tidak berguna, serta peringatan:
Karakter lebar dicetak di ...
Untuk menampilkan UTF-8, gunakan lapisan keluaran ":encoding" atau ":utf8". mendahului
binmode(STDOUT, ":utf8");
ke program contoh ini memastikan bahwa output sepenuhnya UTF-8, dan menghapus
peringatan program.
Anda dapat mengaktifkan UTF-8-ifikasi otomatis dari pegangan file standar Anda, default "buka ()"
layer, dan @ARGV dengan menggunakan sakelar baris perintah "-C" atau "PERL_UNICODE"
variabel lingkungan, lihat perlrun untuk dokumentasi sakelar "-C".
Perhatikan bahwa ini berarti Perl mengharapkan perangkat lunak lain bekerja dengan cara yang sama: jika Perl memiliki
telah dituntun untuk percaya bahwa STDIN harus UTF-8, tetapi kemudian STDIN datang dari yang lain
perintah bukan UTF-8, Perl kemungkinan akan mengeluh tentang UTF-8 yang salah format.
Semua fitur yang menggabungkan Unicode dan I/O juga memerlukan penggunaan fitur PerlIO yang baru.
Hampir semua platform Perl 5.8 menggunakan PerlIO, meskipun: Anda dapat melihat apakah milik Anda dengan
menjalankan "Perl -V" dan mencari "useperlio=define".
Unicode dan EBCDIC
Perl 5.8.0 menambahkan dukungan untuk Unicode pada platform EBCDIC. Dukungan ini diizinkan untuk
lapse di rilis selanjutnya, tetapi dihidupkan kembali di 5.22. Dukungan Unicode agak lebih
kompleks untuk diterapkan karena konversi tambahan diperlukan. Lihat perlebcdic untuk lebih lanjut
informasi.
Pada platform EBCDIC, bentuk enkode Unicode internal adalah UTF-EBCDIC, bukan UTF-8.
Perbedaannya adalah karena UTF-8 "aman ASCII" dalam karakter ASCII yang dikodekan ke UTF-8
apa adanya, sedangkan UTF-EBCDIC adalah "EBCDIC-safe", di mana semua karakter dasar (yang mencakup
semua yang memiliki setara ASCII (seperti "A", "0", "%", dan sebagainya) keduanya sama
EBCDIC dan UTF-EBCDIC. Seringkali, dokumentasi akan menggunakan istilah "UTF-8" yang berarti UTF-EBCDIC
demikian juga. Ini adalah kasus dalam dokumen ini.
membuat Unicode
Bagian ini berlaku sepenuhnya untuk Perls dimulai dengan v5.22. Berbagai peringatan untuk sebelumnya
rilis ada di subbagian "Peringatan rilis sebelumnya" di bawah.
Untuk membuat karakter Unicode dalam literal, gunakan notasi "\N{...}" dalam tanda kutip ganda
string:
my $smiley_from_name = "\N{WAJAH TERSENYUM PUTIH}";
my $smiley_from_code_point = "\N{U+263a}";
Demikian pula, mereka dapat digunakan dalam literal ekspresi reguler
$smiley =~ /\N{WAJAH TERSENYUM PUTIH}/;
$tersenyum =~ /\N{U+263a}/;
Saat run-time Anda dapat menggunakan:
gunakan charname();
$hebrew_alef_from_name saya
= charnames::string_vianame("HEBREW SURAT ALEF");
my $hebrew_alef_from_code_point = charnames::string_vianame("U+05D0");
Secara alami, "ord()" akan melakukan kebalikannya: ia mengubah karakter menjadi titik kode.
Ada opsi runtime lainnya juga. Anda dapat menggunakan "paket ()":
my $hebrew_alef_from_code_point = pack("U", 0x05d0);
Atau Anda dapat menggunakan "chr()", meskipun kurang nyaman dalam kasus umum:
$hebrew_alef_from_code_point = chr(utf8::unicode_to_native(0x05d0));
utf8::upgrade($hebrew_alef_from_code_point);
"utf8::unicode_to_native()" dan "utf8::upgrade()" tidak diperlukan jika argumennya
di atas 0xFF, jadi di atas bisa ditulis sebagai
$hebrew_alef_from_code_point = chr(0x05d0);
karena 0x5d0 di atas 255.
"\x{}" dan "\o{}" juga bisa digunakan untuk menetapkan titik kode pada waktu kompilasi secara double-
string quotish, tetapi, untuk kompatibilitas mundur dengan Perls yang lebih lama, aturan yang sama berlaku sebagai
dengan "chr()" untuk poin kode kurang dari 256.
"utf8::unicode_to_native()" digunakan agar kode Perl portabel untuk platform EBCDIC.
Anda dapat menghilangkannya jika Anda benar-benar yakin tidak ada yang akan pernah ingin menggunakan kode Anda pada non-
platform ASCII. Mulai Perl v5.22, panggilan ke platform ASCII dioptimalkan,
jadi tidak ada penalti kinerja sama sekali dalam menambahkannya. Atau Anda bisa menggunakan yang lain
konstruksi yang tidak memerlukannya.
Lihat "Sumber Daya Lebih Lanjut" untuk mengetahui cara menemukan semua nama dan kode numerik ini.
Terdahulu Pers peringatan
Pada platform EBCDIC, sebelum v5.22, menggunakan "\N{U+...}" tidak berfungsi dengan benar.
Sebelum v5.16, menggunakan "\N{...}" dengan nama karakter (sebagai lawan dari titik kode "U+...")
diperlukan "gunakan charnames :full".
Sebelum v5.14, ada beberapa bug di "\N{...}" dengan nama karakter (sebagai lawan dari
"U+..." titik kode).
"charnames::string_vianame()" diperkenalkan di v5.14. Sebelum itu,
"charnames::vianame()" seharusnya berfungsi, tetapi hanya jika argumennya berbentuk "U+...". Milikmu
taruhan terbaik di sana untuk runtime Unicode dengan nama karakter mungkin:
gunakan charname();
$hebrew_alef_from_name saya
= pack("U", charnames::vianame("HEBREW LETTER ALEF"));
Penanganan Unicode
Menangani Unicode sebagian besar transparan: cukup gunakan string seperti biasa.
Fungsi seperti "index()", "length()", dan "substr()" akan bekerja pada karakter Unicode;
ekspresi reguler akan bekerja pada karakter Unicode (lihat perlunicode dan perlretut).
Perhatikan bahwa Perl menganggap cluster grafem sebagai karakter yang terpisah, jadi misalnya
print length("\N{LATIN CAPITAL LETTER A}\N{MENGABUNGKAN AKSEN AKUT}"),
"\n";
akan mencetak 2, bukan 1. Satu-satunya pengecualian adalah ekspresi reguler memiliki "\X" untuk
mencocokkan cluster grafem yang diperluas. (Jadi "\X" dalam ekspresi reguler akan cocok dengan
seluruh urutan kedua contoh karakter.)
Namun, hidup tidak begitu transparan ketika bekerja dengan pengkodean lama, I/O, dan
kasus khusus tertentu:
Warisan Encode
Saat Anda menggabungkan data lawas dan Unicode, data lawas perlu ditingkatkan ke Unicode.
Biasanya data warisan diasumsikan ISO 8859-1 (atau EBCDIC, jika berlaku).
Modul "Encode" mengetahui tentang banyak penyandian dan memiliki antarmuka untuk melakukan konversi
antara pengkodean tersebut:
gunakan Encode 'decode';
$data = dekode("iso-8859-3", $data); # konversi dari warisan ke utf-8
Unicode I / O
Biasanya, menulis data Unicode
print FH $some_string_with_unicode, "\n";
menghasilkan byte mentah yang kebetulan digunakan Perl untuk menyandikan string Unicode secara internal.
Pengkodean internal Perl tergantung pada sistem serta karakter apa yang kebetulan ada di
tali pada saat itu. Jika salah satu karakter berada pada titik kode 0x100 atau lebih, Anda
akan mendapat peringatan. Untuk memastikan bahwa output dirender secara eksplisit dalam penyandian, Anda
keinginan--dan untuk menghindari peringatan--buka aliran dengan pengkodean yang diinginkan. Beberapa
contoh:
buka FH, ">:utf8", "file";
buka FH, ">:encoding(ucs2)", "file";
buka FH, ">:encoding(UTF-8)", "file";
buka FH, ">:encoding(shift_jis)", "file";
dan pada aliran yang sudah terbuka, gunakan "binmode()":
binmode(STDOUT, ":utf8");
binmode(STDOUT, ":encoding(ucs2)");
binmode(STDOUT, ":encoding(UTF-8)");
binmode(STDOUT, ":encoding(shift_jis)");
Pencocokan nama penyandian longgar: huruf besar/kecil tidak masalah, dan banyak penyandian memiliki
beberapa alias. Perhatikan bahwa lapisan ":utf8" harus selalu ditentukan persis seperti itu;
ini tidak tunduk pada pencocokan longgar nama pengkodean. Perhatikan juga bahwa saat ini
":utf8" tidak aman untuk input, karena menerima data tanpa memvalidasinya
memang valid UTF-8; Anda sebaiknya menggunakan ":encoding(utf-8)" (dengan atau tanpa tanda hubung).
Lihat PerlIO untuk lapisan ":utf8", PerlIO::encoding dan Encode::PerlIO untuk
":encoding()", dan Encode::Didukung untuk banyak penyandian yang didukung oleh "Encode"
modul.
Membaca dalam file yang Anda tahu kebetulan dikodekan di salah satu Unicode atau warisan
pengkodean tidak secara ajaib mengubah data menjadi Unicode di mata Perl. Untuk melakukannya,
tentukan lapisan yang sesuai saat membuka file
buka($fh saya,'<:encoding(utf8)', 'apa saja');
$line_of_unicode saya = <$fh>;
open($fh saya,'<:encoding(Big5)', 'apa saja');
$line_of_unicode saya = <$fh>;
Lapisan I/O juga dapat ditentukan secara lebih fleksibel dengan pragma "terbuka". Lihat terbuka, atau
lihat contoh berikut.
gunakan buka ':encoding(utf8)'; # penyandian default input/output adalah
#UTF-8
buka X, ">berkas";
cetak X chr(0x100), "\n";
tutup X;
buka Y, "
printf "%#x\n", ord( ); # ini harus mencetak 0x100
tutup Y;
Dengan pragma "terbuka" Anda dapat menggunakan lapisan ": lokal"
BEGIN { $ENV{LC_ALL} = $ENV{LANG} = 'ru_RU.KOI8-R' }
# :locale akan menyelidiki variabel lingkungan lokal seperti
#LC_ALL
gunakan buka OUT => ':locale'; #russki parusski
buka(O, ">koi8");
cetak O chr(0x430); # Unicode CYRILLIC HURUF KECIL A = KOI8-R 0xc1
tutup O;
buka (saya, "
printf "%#x\n", ord( ), "\n"; # ini harus mencetak 0xc1
tutup aku;
Metode ini memasang filter transparan pada aliran I/O yang mengubah data dari
pengkodean yang ditentukan saat dibaca dari aliran. Hasilnya selalu Unicode.
Pragma terbuka mempengaruhi semua panggilan "terbuka ()" setelah pragma dengan mengatur lapisan default.
Jika Anda hanya ingin memengaruhi aliran tertentu, gunakan lapisan eksplisit secara langsung di "open()"
panggilan.
Anda dapat mengganti penyandian pada aliran yang sudah dibuka dengan menggunakan "binmode()"; lihat "binmode"
di perlfunc.
":locale" saat ini tidak berfungsi dengan "open()" dan "binmode()", hanya dengan "open"
pragma. Metode ":utf8" dan ":encoding(...)" berfungsi dengan semua "open()",
"binmode()", dan pragma "terbuka".
Demikian pula, Anda dapat menggunakan lapisan I/O ini pada aliran keluaran untuk secara otomatis mengonversi Unicode
ke pengkodean yang ditentukan saat ditulis ke aliran. Sebagai contoh, berikut ini
snippet menyalin konten file "text.jis" (dikodekan sebagai ISO-2022-JP, alias JIS) ke
file "text.utf8", dikodekan sebagai UTF-8:
buka($nihongo saya, '<:encoding(iso-2022-jp)', 'text.jis');
open($unicode saya, '>:utf8', 'text.utf8');
while (<$nihongo>) { print $unicode $_ }
Penamaan penyandian, baik oleh "terbuka ()" dan dengan pragma "terbuka" memungkinkan untuk fleksibel
nama: "koi8-r" dan "KOI8R" keduanya akan dipahami.
Pengkodean umum yang dikenali oleh ISO, MIME, IANA, dan berbagai standardisasi lainnya
organisasi diakui; untuk daftar yang lebih detail, lihat Encode::Supported.
"read()" membaca karakter dan mengembalikan jumlah karakter. "cari ()" dan "beri tahu ()"
beroperasi pada jumlah byte, seperti halnya "sysread()" dan "sysseek()".
Perhatikan bahwa karena perilaku default tidak melakukan konversi apa pun pada input if
tidak ada lapisan default, mudah untuk salah menulis kode yang terus berkembang
file dengan berulang kali menyandikan data:
# PERINGATAN KODE BURUK
buka F, "berkas";
lokal $/; ## membaca seluruh file karakter 8-bit
$t = ;
tutup F;
buka F, ">:encoding(utf8)", "file";
cetak F$t; ## konversikan ke UTF-8 pada keluaran
tutup F;
Jika Anda menjalankan kode ini dua kali, isi dari fillet akan dikodekan UTF-8 dua kali. Sebuah "penggunaan
open ':encoding(utf8)'" akan menghindari bug, atau secara eksplisit membuka juga fillet
untuk masukan sebagai UTF-8.
CATATAN: fitur ":utf8" dan ":encoding" hanya berfungsi jika Perl Anda dibuat dengan
PerlIO, yang merupakan default pada kebanyakan sistem.
Menampilkan Unicode As Teks
Terkadang Anda mungkin ingin menampilkan skalar Perl yang berisi Unicode sebagai ASCII sederhana (atau
EBCDIC) teks. Subrutin berikut mengubah argumennya sehingga karakter Unicode
dengan poin kode lebih besar dari 255 ditampilkan sebagai "\x{...}", karakter kontrol (seperti
"\n") ditampilkan sebagai "\x..", dan karakter lainnya sebagai dirinya sendiri:
sub string_bagus {
Ikuti("",
map { $_ > 255 # jika karakter lebar...
? sprintf("\\x{%04X}", $_) # \x{...}
: chr($_) =~ /[[:cntrl:]]/ # else jika karakter kontrol...
? sprintf("\\x%02X", $_) # \x..
: quotemeta(chr($_)) # lain dikutip atau sebagai diri mereka sendiri
} membongkar("W*", $_[0])); # membongkar karakter Unicode
}
Sebagai contoh,
nice_string("foo\x{100}bar\n")
mengembalikan string
'foo\x{0100}bar\x0A'
yang siap dicetak.
("\\x{}" digunakan di sini sebagai ganti "\\N{}", karena kemungkinan besar Anda ingin melihat apa
nilai asli adalah.)
Khusus kasus
· Operator Pelengkap Bit ~ Dan vektor()
Operator pelengkap bit "~" dapat menghasilkan hasil yang mengejutkan jika digunakan pada string
berisi karakter dengan nilai ordinal di atas 255. Dalam kasus seperti itu, hasilnya adalah
konsisten dengan pengkodean internal karakter, tetapi tidak dengan banyak hal lain. Jadi
jangan lakukan itu. Demikian pula untuk "vec()": Anda akan beroperasi pada internal-encoded
pola bit karakter Unicode, bukan pada nilai titik kode, yang sangat
mungkin bukan yang Anda inginkan.
· Mengintip Encoding Internal Perl
Pengguna normal Perl seharusnya tidak pernah peduli bagaimana Perl mengkodekan string Unicode tertentu
(karena cara normal untuk mendapatkan isi string dengan Unicode--melalui input
dan output--harus selalu melalui lapisan I/O yang ditentukan secara eksplisit). Tapi jika Anda harus,
ada dua cara untuk melihat di balik layar.
Salah satu cara mengintip ke dalam pengkodean internal karakter Unicode adalah dengan menggunakan
"unpack("C*", ..." untuk mendapatkan byte dari apa pun pengkodean string yang terjadi, atau
"unpack("U0..", ...)" untuk mendapatkan byte dari penyandian UTF-8:
# ini mencetak c4 80 untuk UTF-8 byte 0xc4 0x80
print join(" ", unpack("U0(H2)*", pack("U", 0x100))), "\n";
Namun cara lain adalah dengan menggunakan modul Devel::Peek:
perl -MDevel::Peek -e 'Dump(chr(0x100))'
Itu menunjukkan bendera "UTF8" dalam FLAGS dan byte UTF-8 dan karakter Unicode di
"PV". Lihat juga nanti dalam dokumen ini diskusi tentang "utf8::is_utf8()"
fungsi.
Advanced Topik
· Persamaan String
Pertanyaan tentang kesetaraan string ternyata agak rumit di Unicode: apa yang Anda?
dimaksud dengan "sama"?
(Apakah "HURUF KAPITAL LATIN A DENGAN AKUT" sama dengan "HURUF KAPITAL LATIN A"?)
Jawaban singkatnya adalah bahwa secara default Perl hanya membandingkan kesetaraan ("eq", "ne") berdasarkan
pada poin kode karakter. Dalam kasus di atas, jawabannya adalah tidak (karena 0x00C1
!= 0x0041). Tapi terkadang, setiap HURUF MODAL A harus dianggap sama, atau bahkan
A dari kasus apapun.
Jawaban panjangnya adalah Anda perlu mempertimbangkan normalisasi karakter dan casing
masalah: lihat Unicode::Normalize, Laporan Teknis Unicode #15, Normalisasi Unicode
Formulirhttp://www.unicode.org/unicode/reports/tr15> dan bagian tentang pemetaan kasus di
Standar Unicodehttp://www.unicode.org>.
Pada Perl 5.8.0, pelipatan huruf "Penuh" dari Kasus Pemetaan/Casing Khusus is
diimplementasikan, tetapi bug tetap ada di "qr//i" bersamanya, sebagian besar diperbaiki oleh 5.14, dan
pada dasarnya seluruhnya oleh 5.18.
· Pengumpulan Tali
Orang-orang suka melihat string mereka diurutkan dengan baik--atau seperti bahasa Unicode, disusun.
Tapi sekali lagi, apa yang Anda maksud dengan menyusun?
(Apakah "HURUF LATIN CAPITAL A WITH ACUTE" muncul sebelum atau sesudah "LATIN CAPITAL LETTER A
DENGAN KUburan"?)
Jawaban singkatnya adalah bahwa secara default, Perl membandingkan string ("lt", "le", "cmp", "ge",
"gt") hanya berdasarkan poin kode karakter. Dalam kasus di atas, jawabannya
adalah "setelah", karena 0x00C1 > 0x00C0.
Jawaban panjangnya adalah "itu tergantung", dan jawaban yang baik tidak dapat diberikan tanpa
mengetahui (paling tidak) konteks bahasa. Lihat Unicode::Collate, dan Unicode
Pemeriksaan Algoritma <http://www.unicode.org/unicode/reports/tr10/>
bermacam-macam
· Rentang dan Kelas Karakter
Rentang karakter dalam kelas karakter kurung ekspresi reguler (misalnya, "/[az]/")
dan di operator "tr///" (juga dikenal sebagai "y///") secara ajaib tidak menyadari Unicode.
Apa artinya ini adalah bahwa "[A-Za-z]" tidak akan secara ajaib mulai berarti "semua abjad
huruf" (bukan berarti itu bahkan untuk karakter 8-bit; untuk itu, jika Anda
menggunakan lokal (perllocale), gunakan "/[[:alpha:]]/"; dan jika tidak, gunakan 8-bit-aware
properti "\p{alpha}").
Semua properti yang dimulai dengan "\p" (dan kebalikannya "\P") sebenarnya adalah karakter
kelas yang sadar akan Unicode. Ada lusinan, lihat perluniprops.
Mulai dari v5.22, Anda dapat menggunakan titik kode Unicode sebagai titik akhir reguler
rentang karakter pola ekspresi, dan rentang tersebut akan mencakup semua kode Unicode
titik yang terletak di antara titik akhir tersebut, inklusif.
qr/ [\N{U+03]-\N{U+20}] /x
termasuk titik kode "\N{U+03}", "\N{U+04}", ..., "\N{U+20}".
(Direncanakan untuk memperluas perilaku ini ke rentang "tr///" di Perl v5.24.)
· Konversi String-Ke-Angka
Unicode memang mendefinisikan beberapa karakter desimal--dan numerik--lainnya selain
familiar 0 sampai 9, seperti angka Arab dan India. Perl tidak mendukung string-
konversi ke angka untuk digit selain ASCII 0 hingga 9 (dan ASCII "a" ke "f" untuk
heksadesimal). Untuk mendapatkan konversi yang aman dari string Unicode apa pun, gunakan "jumlah()"Dalam
Unikode::UCD.
Pertanyaan Dengan jawaban
· Apakah Skrip Lama Saya Akan Rusak?
Sangat mungkin tidak. Kecuali Anda menghasilkan karakter Unicode entah bagaimana, lama
perilaku harus dipertahankan. Tentang satu-satunya perilaku yang telah berubah dan yang
bisa mulai menghasilkan Unicode adalah perilaku lama "chr()" di mana memasok
argumen lebih dari 255 menghasilkan karakter modulo 255. "chr(300)", misalnya, adalah
sama dengan "chr(45)" atau "-" (dalam ASCII), sekarang menjadi LATIN CAPITAL LETTER I WITH BREVE.
· Bagaimana Saya Membuat Skrip Saya Bekerja Dengan Unicode?
Sangat sedikit pekerjaan yang diperlukan karena tidak ada yang berubah sampai Anda menghasilkan Unicode
data. Yang paling penting adalah mendapatkan input sebagai Unicode; untuk itu, lihat sebelumnya
diskusi I/O. Untuk mendapatkan dukungan Unicode yang mulus, tambahkan "gunakan fitur
'unicode_strings'" (atau "gunakan 5.012" atau lebih tinggi) ke skrip Anda.
· Bagaimana Saya Tahu Apakah String Saya Ada Di Unicode?
Anda tidak harus peduli. Tetapi Anda dapat melakukannya jika Perl Anda sebelum 5.14.0 atau belum
ditentukan "gunakan fitur 'unicode_strings'" atau "gunakan 5.012" (atau lebih tinggi) karena sebaliknya
aturan untuk poin kode dalam kisaran 128 hingga 255 berbeda tergantung pada
apakah string yang dikandungnya ada di Unicode atau tidak. (Lihat "Ketika Unicode
Tidak Terjadi" di perlunicode.)
Untuk menentukan apakah sebuah string dalam Unicode, gunakan:
cetak utf8::is_utf8($string) ? 1 : 0, "\n";
Tetapi perhatikan bahwa ini tidak berarti bahwa salah satu karakter dalam string diperlukan
UTF-8 dikodekan, atau salah satu karakter memiliki poin kode lebih besar dari 0xFF (255)
atau bahkan 0x80 (128), atau string tersebut memiliki karakter sama sekali. Semua "is_utf8()"
lakukan adalah mengembalikan nilai flag "utf8ness" internal yang dilampirkan ke $string.
Jika bendera tidak aktif, byte dalam skalar ditafsirkan sebagai pengkodean byte tunggal.
Jika bendera aktif, byte dalam skalar ditafsirkan sebagai (panjang variabel,
berpotensi multi-byte) titik kode yang disandikan UTF-8 karakter. Byte ditambahkan ke
String yang disandikan UTF-8 secara otomatis ditingkatkan ke UTF-8. Jika campuran non-UTF-8 dan
Skalar UTF-8 digabungkan (interpolasi kutip ganda, penggabungan eksplisit, atau
printf/sprintf parameter substitusi), hasilnya akan dikodekan UTF-8 seolah-olah salinan
string byte ditingkatkan ke UTF-8: misalnya,
$a = "ab\x80c";
$b = "\x{100}";
print "$a = $b\n";
string keluaran akan dikodekan UTF-8 "ab\x80c = \x{100}\n", tetapi $a akan tetap byte-
dikodekan.
Terkadang Anda mungkin benar-benar perlu mengetahui panjang byte string alih-alih
panjang karakter. Untuk itu gunakan fungsi "Encode::encode_utf8()" atau
pragma "byte" dan fungsi "panjang ()":
$unicode saya = chr(0x100);
panjang cetak($unicode), "\n"; # akan mencetak 1
membutuhkan Enkode;
panjang cetak(Encode::encode_utf8($unicode)),"\n"; # akan mencetak 2
gunakan byte;
panjang cetak($unicode), "\n"; # juga akan mencetak 2
# (0xC4 0x80 dari UTF-8)
tidak ada byte;
· Bagaimana Saya Mengetahui Apa yang Dimiliki Pengkodean File?
Anda dapat mencoba Encode::Guess, tetapi memiliki sejumlah batasan.
· Bagaimana cara mendeteksi data yang tidak valid dalam pengkodean tertentu?
Gunakan paket "Encode" untuk mencoba mengonversinya. Sebagai contoh,
gunakan Enkode 'decode_utf8';
if (eval { decode_utf8($string, Enkode::FB_CROAK); 1 }) {
# $string valid utf8
} Else {
# $string tidak valid utf8
}
Atau gunakan "membongkar" untuk mencoba mendekodekannya:
gunakan peringatan;
@chars = unpack("C0U*", $string_of_bytes_that_I_think_is_utf8);
Jika tidak valid, peringatan "Karakter UTF-8 yang salah" akan muncul. "C0" berarti "proses
karakter string per karakter". Tanpa itu, "unpack("U*", ...)" akan berfungsi
dalam mode "U0" (default jika string format dimulai dengan "U") dan akan kembali
byte yang membentuk pengkodean UTF-8 dari string target, sesuatu yang akan
selalu bekerja.
· Bagaimana Saya Mengubah Data Biner Menjadi Encoding Tertentu, Atau Sebaliknya?
Ini mungkin tidak berguna seperti yang Anda bayangkan. Biasanya, Anda tidak perlu melakukannya.
Di satu sisi, apa yang Anda minta tidak masuk akal: penyandian adalah untuk
karakter, dan data biner bukan "karakter", jadi ubah "data" menjadi beberapa
pengkodean tidak berarti kecuali Anda tahu set karakter dan penyandian apa
data biner masuk, dalam hal ini bukan hanya data biner, sekarang bukan?
Jika Anda memiliki urutan byte mentah yang Anda tahu harus ditafsirkan melalui a
pengkodean tertentu, Anda dapat menggunakan "Encode":
gunakan Encode 'from_to';
from_to($data, "iso-8859-1", "utf-8"); # dari latin-1 ke utf-8
Panggilan ke "from_to()" mengubah byte dalam $data, tetapi tidak ada materi tentang
sifat string telah berubah sejauh menyangkut Perl. Baik sebelum dan sesudah
panggilan, string $data hanya berisi sekelompok byte 8-bit. Sejauh Perl adalah
bersangkutan, pengkodean string tetap sebagai "byte 8-bit asli sistem".
Anda mungkin menghubungkan ini dengan modul 'Terjemahkan' fiksi:
gunakan Terjemahkan;
$frase saya = "Ya";
Terjemahkan::from_to($phrase, 'english', 'deutsch');
## frase sekarang mengandung "Ja"
Isi string berubah, tetapi bukan sifat string. Perl tidak
tahu lebih banyak setelah panggilan daripada sebelumnya bahwa isi string menunjukkan
setuju.
Kembali ke konversi data. Jika Anda memiliki (atau menginginkan) data dalam 8-bit asli sistem Anda
encoding (mis. Latin-1, EBCDIC, dll.), Anda dapat menggunakan paket/bongkar untuk mengonversi ke/dari
Unikode.
$native_string = pack("W*", unpack("U*", $Unicode_string));
$Unicode_string = pack("U*", unpack("W*", $native_string));
Jika Anda memiliki urutan byte, Anda tahu adalah UTF-8 yang valid, tetapi Perl belum mengetahuinya,
Anda juga dapat menjadikan Perl sebagai orang percaya:
gunakan Enkode 'decode_utf8';
$Unicode = decode_utf8($byte);
atau:
$Unicode = paket("U0a*", $byte);
Anda dapat menemukan byte yang membentuk urutan UTF-8 dengan
@byte = membongkar("C*", $Unicode_string)
dan Anda dapat membuat Unicode yang terbentuk dengan baik dengan
$Unicode_string = paket("U*", 0xff, ...)
· Bagaimana Saya Menampilkan Unicode? Bagaimana Saya Memasukkan Unicode?
Lihathttp://www.alanwood.net/unicode/> dan
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
· Bagaimana Unicode Bekerja Dengan Lokal Tradisional?
Jika lokal Anda adalah lokal UTF-8, mulai dari Perl v5.20, Perl bekerja dengan baik untuk semua
kategori kecuali "LC_COLLATE" yang berhubungan dengan pengurutan dan operator "cmp".
Untuk lokal lain, mulai dari Perl 5.16, Anda dapat menentukan
gunakan lokal ':not_characters';
untuk membuat Perl bekerja dengan baik dengan mereka. Tangkapannya adalah Anda harus menerjemahkan dari
set karakter lokal ke/dari Unicode sendiri. Lihat "Unicode I/O" di atas untuk mengetahui caranya
gunakan buka ':lokal';
untuk mencapai ini, tetapi detail lengkap ada di "Unicode dan UTF-8" di perlllocale,
termasuk gotcha yang terjadi jika Anda tidak menentukan ":not_characters".
Heksadesimal catatan
Standar Unicode lebih suka menggunakan notasi heksadesimal karena lebih jelas menunjukkan
pembagian Unicode menjadi blok 256 karakter. Heksadesimal juga lebih pendek
daripada desimal. Anda juga dapat menggunakan notasi desimal, tetapi belajar menggunakan heksadesimal saja
membuat hidup lebih mudah dengan standar Unicode. Notasi "U+HHHH" menggunakan heksadesimal, untuk
contoh.
Awalan "0x" berarti angka heksadesimal, digitnya adalah 0-9 dan af (atau AF, kasus
tidak masalah). Setiap digit heksadesimal mewakili empat bit, atau setengah byte. "mencetak
0x..., "\n"" akan menampilkan angka heksadesimal dalam desimal, dan "printf "%x\n", $desimal" akan
menunjukkan angka desimal dalam heksadesimal. Jika Anda hanya memiliki "digit heksadesimal" dari heksadesimal
nomor, Anda dapat menggunakan fungsi "hex()".
cetak 0x0009, "\n"; #9
cetak 0x000a, "\n"; # 10
cetak 0x000f, "\n"; #15
cetak 0x0010, "\n"; #16
cetak 0x0011, "\n"; #17
cetak 0x0100, "\n"; #256
cetak 0x0041, "\n"; #65
printf "%x\n", 65; #41
printf "%#x\n", 65; #0x41
cetak hex("41"), "\n"; #65
Lebih lanjut Sumber Daya
· Konsorsium Unicode
<http://www.unicode.org/>
· FAQ Unicode
<http://www.unicode.org/unicode/faq/>
· Glosarium Unicode
<http://www.unicode.org/glossary/>
· Daftar Bacaan Rekomendasi Unicode
Konsorsium Unicode memiliki daftar artikel dan buku, beberapa di antaranya memberikan banyak
perawatan Unicode yang lebih mendalam:http://unicode.org/resources/readinglist.html>
· Sumber Daya Berguna Unicode
<http://www.unicode.org/unicode/onlinedat/resources.html>
· Dukungan Unicode dan Multibahasa dalam HTML, Font, Browser Web, dan Aplikasi Lainnya
<http://www.alanwood.net/unicode/>
· FAQ UTF-8 dan Unicode untuk Unix/Linux
<http://www.cl.cam.ac.uk/~mgk25/unicode.html>
· Set Karakter Warisan
<http://www.czyborra.com/>http://www.eki.ee/letter/>
· Anda dapat menjelajahi berbagai informasi dari file data Unicode menggunakan
Modul "Unicode::UCD".
UNICODE IN OLDER PERLS
Jika Anda tidak dapat meningkatkan Perl Anda ke 5.8.0 atau lebih baru, Anda masih dapat melakukan beberapa Unicode
pemrosesan dengan menggunakan modul "Unicode::String", "Unicode::Map8", dan "Unicode::Map",
tersedia dari CPAN. Jika Anda telah menginstal ulang kode GNU, Anda juga dapat menggunakan Perl
front-end "Convert::Recode" untuk konversi karakter.
Berikut ini adalah konversi cepat dari byte ISO 8859-1 (Latin-1) ke UTF-8 byte dan
kembali, kode berfungsi bahkan dengan versi Perl 5 yang lebih lama.
# ISO 8859-1 hingga UTF-8
s/([\x80-\xFF])/chr(0xC0|ord($1)>>6).chr(0x80|ord($1)&0x3F)/eg;
# UTF-8 hingga ISO 8859-1
s/([\xC2\xC3])([\x80-\xBF])/chr(ord($1)<<6&0xC0|ord($2)&0x3F)/eg;
Gunakan perluniintro online menggunakan layanan onworks.net