Ini ialah arahan perlunicode yang boleh dijalankan dalam penyedia pengehosan percuma OnWorks menggunakan salah satu daripada berbilang stesen kerja dalam talian percuma kami seperti Ubuntu Online, Fedora Online, emulator dalam talian Windows atau emulator dalam talian MAC OS.
JADUAL:
NAMA
perlunicode - Sokongan Unicode dalam Perl
DESCRIPTION
Jika anda belum melakukannya, sebelum membaca dokumen ini, anda harus membiasakan diri dengan kedua-duanya
perlunitut dan perluniintro.
Unicode bertujuan untuk UNI-fy en-KOD-Perkara semua watak dunia menjadi satu
Standard. Untuk beberapa daripada pelbagai piawaian pengekodan yang wujud semasa Unicode
mula-mula dibuat, menukar daripada setiap satu kepada Unicode pada asasnya bermakna menambah pemalar pada setiap satu
titik kod dalam standard asal, dan menukar kembali bermakna hanya menolak perkara yang sama
tetap. Untuk ASCII dan ISO-8859-1, pemalar ialah 0. Untuk ISO-8859-5, (Cyrillic)
pemalar ialah 864; untuk bahasa Ibrani (ISO-8859-8), itu 1488; Thai (ISO-8859-11), 3424; dan juga
seterusnya. Ini memudahkan untuk melakukan penukaran, dan memudahkan penggunaan Unicode.
Dan ia berjaya; pada masa kini, piawaian warisan itu jarang digunakan. Kebanyakan orang menggunakan
Unicode.
Unicode ialah standard yang komprehensif. Ia menyatakan banyak perkara di luar skop Perl,
seperti cara memaparkan urutan aksara. Untuk perbincangan penuh tentang semua aspek
Unicode, lihathttp://www.unicode.org>.
penting Kaveat
Walaupun sebahagian daripada bahagian ini mungkin tidak dapat anda fahami pada bacaan pertama, kami
fikir ia cukup penting untuk menyerlahkan beberapa gotcha sebelum menyelidiki lebih lanjut, jadi
begini:
Sokongan Unicode adalah keperluan yang meluas. Manakala Perl tidak melaksanakan Unicode
standard atau laporan teknikal yang disertakan dari muka depan ke muka, Perl menyokong banyak perkara
Ciri Unicode.
Selain itu, penggunaan Unicode mungkin menimbulkan isu keselamatan yang tidak jelas. Baca Unicode
Pertimbangan Keselamatanhttp://www.unicode.org/reports/tr36>.
Paling selamat jika anda "menggunakan ciri 'unicode_strings'"
Untuk mengekalkan keserasian ke belakang, Perl tidak menghidupkan dalaman sepenuhnya
Sokongan Unicode melainkan pragma "gunakan ciri 'unicode_strings'" ditentukan. (Ini
dipilih secara automatik jika anda "menggunakan 5.012" atau lebih tinggi.) Kegagalan untuk melakukan ini boleh
mencetuskan kejutan yang tidak dijangka. Lihat "Pepijat Unicode"" di bawah.
Pragma ini tidak menjejaskan I/O. Ia juga tidak mengubah perwakilan dalaman
rentetan, hanya tafsirannya. Masih terdapat beberapa tempat di mana Unicode
tidak disokong sepenuhnya, seperti dalam nama fail.
Lapisan Input dan Output
Gunakan lapisan ": pengekodan(...)" untuk membaca dan menulis kepada pemegang fail menggunakan
pengekodan yang ditentukan. (Lihat terbuka.)
Anda harus menukar skrip Perl bukan ASCII, bukan UTF-8 anda kepada UTF-8.
Lihat pengekodan.
"use utf8" masih diperlukan untuk mendayakan UTF-8 dalam skrip
Jika skrip Perl anda sendiri dikodkan dalam UTF-8, pragma "use utf8" mestilah
disertakan secara eksplisit untuk membolehkan pengiktirafan itu (dalam rentetan atau ungkapan biasa
literal, atau dalam nama pengecam). ini is yang hanyalah masa apabila an jelas "gunakan utf8"
is diperlukan. (Lihat utf8).
Skrip bertanda "BOM" dan skrip UTF-16 dikesan secara automatik
Walau bagaimanapun, jika skrip Perl bermula dengan Unicode "BOM" (UTF-16LE, UTF16-BE, atau
UTF-8), atau jika skrip kelihatan seperti UTF-16 yang tidak bertanda "BOM" sama ada endianness, Perl
akan membaca dengan betul dalam skrip sebagai pengekodan Unicode yang sesuai. ("BOM"-kurang
UTF-8 tidak boleh diiktiraf atau dibezakan dengan berkesan daripada ISO 8859-1 atau lain-lain
pengekodan lapan bit.)
Byte and Watak Semantik
Sebelum Unicode, kebanyakan pengekodan menggunakan 8 bit (satu bait) untuk mengekod setiap aksara. Justeru
aksara ialah bait, dan bait ialah aksara, dan mungkin terdapat hanya 256 atau kurang
watak yang mungkin. "Semantik Byte" dalam tajuk bahagian ini merujuk kepada ini
tingkah laku. Tidak perlu membezakan antara "Byte" dan "Watak".
Kemudian bersama Unicode yang mempunyai ruang untuk lebih sejuta aksara (dan Perl membenarkan
lebih lagi). Ini bermakna bahawa aksara mungkin memerlukan lebih daripada satu bait untuk diwakili
itu, maka kedua-dua istilah itu tidak lagi setara. Apa yang penting ialah watak sebagai
keseluruhan entiti, dan bukan biasanya bait yang membentuknya. Itulah istilahnya
"Semantik Watak" dalam tajuk bahagian ini merujuk kepada.
Perl terpaksa menukar secara dalaman untuk memisahkan "bait" daripada "watak". Adalah penting bahawa
anda juga menukar idea anda, jika anda belum melakukannya, supaya "bait" dan "watak" tidak
lagi bermakna perkara yang sama dalam fikiran anda.
Blok binaan asas rentetan Perl sentiasa menjadi "watak". Perubahan
pada asasnya datang ke bahawa pelaksanaan tidak lagi berfikir bahawa watak sentiasa
hanya satu bait.
Terdapat pelbagai perkara yang perlu diperhatikan:
· Fungsi pengendalian rentetan, sebahagian besarnya, terus beroperasi dari segi
watak. "length()", sebagai contoh, mengembalikan bilangan aksara dalam rentetan,
sama seperti dahulu. Tetapi bilangan itu tidak lagi semestinya sama dengan bilangan
bait dalam rentetan (mungkin terdapat lebih banyak bait daripada aksara). Yang lain seperti itu
fungsi termasuk "chop()", "chomp()", "substr()", "pos()", "index()", "rindex()",
"sort()", "sprintf()", dan "write()".
Pengecualian adalah:
· "vec" berorientasikan bit
· format "pek"/"buka bungkus" "C" berorientasikan bait
Walau bagaimanapun, penentu "W" beroperasi pada keseluruhan aksara, begitu juga dengan "U"
penentu.
· beberapa pengendali yang berinteraksi dengan sistem pengendalian platform
Operator yang berurusan dengan nama fail adalah contoh.
· apabila fungsi dipanggil dari dalam skop pragma "guna bait".
Mungkin, anda harus menggunakan ini hanya untuk penyahpepijatan.
· Rentetan--termasuk kekunci cincang--dan corak ungkapan biasa mungkin mengandungi aksara
yang mempunyai nilai ordinal lebih besar daripada 255.
Jika anda menggunakan editor Unicode untuk mengedit program anda, aksara Unicode mungkin berlaku
terus dalam rentetan literal dalam pengekodan UTF-8, atau UTF-16. (Mantan
memerlukan "BOM" atau "use utf8", yang terakhir memerlukan "BOM".)
"Mencipta Unicode" dalam perluniintro memberikan cara lain untuk meletakkan aksara bukan ASCII
rentetan anda.
· Fungsi "chr()" dan "ord()" berfungsi pada keseluruhan aksara.
· Ungkapan biasa sepadan dengan keseluruhan aksara. Sebagai contoh, "." sepadan dengan keseluruhan
aksara dan bukannya hanya satu bait.
· Operator "tr///" menterjemah seluruh aksara. (Perhatikan bahawa "tr///CU"
fungsi telah dialih keluar. Untuk kefungsian yang serupa dengan itu, lihat "pack('U0',
...)" dan "pek('C0', ...)").
· "skalar reverse()" terbalik mengikut aksara dan bukannya dengan bait.
· Operator rentetan bit, "& | ^ ~" dan (bermula dalam v5.22) "&. |. ^. ~." boleh beroperasi
pada aksara yang tidak sesuai dengan bait. Walau bagaimanapun, tingkah laku semasa mungkin
ubah. Anda tidak seharusnya menggunakan operator ini pada rentetan yang dikodkan dalam UTF-8. Jika
anda tidak pasti tentang pengekodan rentetan, turun tarafnya sebelum menggunakan mana-mana daripada ini
pengendali; anda boleh menggunakan "utf8::utf8_downgrade()".
Intinya ialah Perl sentiasa mengamalkan "Semantik Watak", tetapi dengan
kedatangan Unicode, yang kini berbeza daripada "Semantik Byte".
ASCII peraturan berbanding Unicode peraturan
Sebelum Unicode, apabila aksara ialah bait ialah aksara, Perl hanya tahu tentang 128
aksara yang ditakrifkan oleh ASCII, kod mata 0 hingga 127 (kecuali di bawah "guna tempat").
Itu menyebabkan kod mata 128 hingga 255 tidak ditetapkan, dan tersedia untuk sebarang kegunaan a
program mungkin mahu. Satu-satunya semantik yang mereka ada ialah nombor ordinal mereka, dan bahawa mereka
bukan ahli daripada kelas watak bukan negatif. Tiada yang dianggap sepadan
"\w" sebagai contoh, tetapi semua sepadan dengan "\W".
Unicode, sudah tentu, memberikan setiap mata kod tersebut makna tertentu (bersama-sama dengan
yang melebihi 255). Untuk mengekalkan keserasian ke belakang, Perl hanya menggunakan makna Unicode
apabila terdapat beberapa petunjuk bahawa Unicode adalah apa yang dimaksudkan; sebaliknya bukan ASCII
mata kod kekal dianggap seolah-olah ia tidak diberikan.
Berikut ialah cara Perl mengetahui bahawa rentetan harus dianggap sebagai Unicode:
· Dalam skop "use utf8"
Jika keseluruhan program adalah Unicode (ditandakan dengan menggunakan 8-bit Unicode Tubah bentuk
Format), maka semua rentetan di dalamnya mestilah Unicode.
· Dalam skop "gunakan ciri 'unicode_strings'"
Pragma ini dicipta supaya anda boleh memberitahu Perl secara jelas bahawa operasi dilaksanakan
dalam skopnya ialah menggunakan peraturan Unicode. Lebih banyak operasi terjejas dengan yang lebih baru
perls. Lihat "The "Unicode Bug"".
· Dalam skop "guna 5.012" atau lebih tinggi
Ini secara tersirat menghidupkan "gunakan ciri 'unicode_strings'".
· Dalam skop "gunakan locale 'not_characters'", atau "use locale" dan semasa
locale ialah locale UTF-8.
Yang pertama ditakrifkan untuk membayangkan pengendalian Unicode; dan yang terakhir menunjukkan Unicode
locale, oleh itu tafsiran Unicode bagi semua rentetan di dalamnya.
· Apabila rentetan mengandungi titik kod Unikod sahaja
Perl tidak pernah menerima mata kod melebihi 255 tanpa menjadi Unicode, jadi penggunaannya
membayangkan Unicode untuk keseluruhan rentetan.
· Apabila rentetan mengandungi Unikod bernama titik kod "\N{...}"
Konstruk "\N{...}" secara eksplisit merujuk kepada titik kod Unicode, walaupun ia adalah satu
itu juga dalam ASCII. Oleh itu rentetan yang mengandunginya mestilah Unicode.
· Apabila rentetan telah datang daripada sumber luaran yang ditandakan sebagai Unicode
Pilihan baris arahan "-C" boleh menentukan bahawa input tertentu kepada program adalah
Unicode, dan nilai ini boleh dibaca oleh kod Perl anda, lihat "${^UNICODE}" dalam
perlvar.
· Apabila rentetan telah dinaik taraf kepada UTF-8
Fungsi "utf8::utf8_upgrade()" boleh digunakan secara eksplisit secara kekal (melainkan
"utf8::utf8_downgrade()" seterusnya dipanggil) menyebabkan rentetan dianggap sebagai
Unicode.
· Terdapat kaedah tambahan untuk corak ungkapan biasa
Corak yang disusun dengan pengubah suai "/u" atau "/a" dianggap sebagai Unicode
(walaupun terdapat beberapa sekatan dengan "/a"). Di bawah pengubah "/d" dan "/l",
terdapat beberapa petunjuk lain untuk Unicode; lihat "Pengubah set aksara" dalam
perlre.
Ambil perhatian bahawa semua perkara di atas ditimpa dalam skop "guna bait"; tetapi anda sepatutnya
menggunakan pragma ini hanya untuk penyahpepijatan.
Ambil perhatian juga bahawa sesetengah interaksi dengan sistem pengendalian platform tidak pernah menggunakan Unicode
peraturan.
Apabila peraturan Unicode berkuat kuasa:
· Operator terjemahan kes menggunakan jadual terjemahan kes Unicode.
Ambil perhatian bahawa "uc()", atau "\U" dalam rentetan interpolasi, diterjemahkan kepada huruf besar, manakala
"ucfirst", atau "\u" dalam rentetan interpolasi, diterjemahkan kepada huruf tajuk dalam bahasa yang
membuat perbezaan (yang bersamaan dengan huruf besar dalam bahasa tanpa
perbezaan).
Terdapat modul CPAN, "Unicode::Casing", yang membolehkan anda menentukan sendiri
pemetaan untuk digunakan dalam "lc()", "lcfirst()", "uc()", "ucfirst()", dan "fc" (atau mereka
versi sebaris rentetan petikan dua seperti "\U"). (Sebelum Perl 5.16, ini
kefungsian sebahagiannya disediakan dalam teras Perl, tetapi mengalami beberapa
kelemahan yang tidak dapat diatasi, jadi modul CPAN telah ditulis sebaliknya.)
· Kelas aksara dalam ungkapan biasa sepadan berdasarkan sifat aksara
dinyatakan dalam pangkalan data sifat Unicode.
"\w" boleh digunakan untuk memadankan ideograf Jepun, contohnya; dan "[[:digit:]]" a
nombor Bengali.
· Sifat Unicode bernama, skrip dan julat blok boleh digunakan (seperti kurungan
kelas aksara) dengan menggunakan binaan "\p{}" "matches property" dan "\P{}"
penafian, "tidak sepadan dengan harta".
Lihat "Sifat Aksara Unicode" untuk mendapatkan butiran lanjut.
Anda boleh menentukan sifat watak anda sendiri dan menggunakannya dalam ungkapan biasa
dengan binaan "\p{}" atau "\P{}". Lihat "Sifat Watak Ditakrifkan Pengguna" untuk mendapatkan maklumat lanjut
butiran.
Extended Grafik Tumpuan (Logik watak)
Pertimbangkan watak, sebut "H". Ia boleh muncul dengan pelbagai tanda di sekelilingnya, seperti
aksen akut, atau circumflex, atau pelbagai cangkuk, bulatan, anak panah, dan lain-lain., di atas, di bawah, ke
satu pihak atau yang lain, dan lain-lain. Terdapat banyak kemungkinan di kalangan bahasa dunia.
Bilangan gabungan adalah astronomi, dan jika terdapat aksara untuk setiap satu
gabungan, ia tidak lama lagi akan menghabiskan lebih daripada sejuta kemungkinan aksara Unicode. Jadi
Unicode mengambil pendekatan yang berbeza: terdapat aksara untuk asas "H", dan aksara
untuk setiap markah yang mungkin, dan ini boleh digabungkan secara pelbagai untuk mendapatkan logik akhir
watak. Jadi watak logik--yang kelihatan seperti watak tunggal--boleh menjadi a
urutan lebih daripada satu aksara individu. Standard Unicode memanggil ini
"kelompok grafem lanjutan" (yang merupakan versi yang lebih baik daripada yang tidak digunakan lagi
"kelompok grafem"); Perl memberikan binaan ungkapan biasa "\X" untuk dipadankan
urutan secara keseluruhannya.
Tetapi niat Unicode adalah untuk menyatukan piawaian dan amalan set aksara sedia ada, dan
beberapa piawaian sedia ada mempunyai aksara tunggal yang bermaksud perkara yang sama seperti sesetengah daripadanya
gabungan ini, seperti ISO-8859-1, yang mempunyai beberapa daripadanya. Contohnya, "LATIN
HURUF BESAR E WITH ACUTE" sudah pun berada dalam standard ini apabila Unicode disertakan.
Oleh itu Unicode menambahkannya ke himpunan sebagai aksara tunggal itu. Tetapi watak ini
dianggap oleh Unicode sebagai setara dengan urutan yang terdiri daripada aksara
"HURUF BESAR LATIN E" diikuti dengan watak "MENGABUKKAN AKSEN AKUT".
"HURUF BESAR LATIN E DENGAN ACUTE" dipanggil watak "pra-karang", dan wataknya
kesetaraan dengan jujukan "E" dan "COMBINING AKSEN" dipanggil kanonik
kesetaraan. Semua aksara pra-karang dikatakan mempunyai penguraian (ke dalam
jujukan setara), dan jenis penguraian juga dipanggil kanonik. Rentetan boleh
terdiri sebanyak mungkin aksara yang telah dirangka, atau ia mungkin terdiri daripada
aksara yang terurai sepenuhnya. Unicode memanggil ini masing-masing, "Borang Normalisasi
Composed" (NFC) dan "Normalization Form Decomposed". Modul "Unicode::Normalize"
mengandungi fungsi yang menukar antara keduanya. Rentetan juga mungkin mempunyai kedua-duanya terdiri
watak-watak dan watak terurai; modul ini boleh digunakan untuk menjadikan semuanya satu atau
lain.
Anda mungkin dibentangkan dengan rentetan dalam mana-mana bentuk yang setara ini. Terdapat pada masa ini
tiada dalam Perl 5 yang mengabaikan perbezaan. Jadi anda perlu mengendalikannya secara khusus.
Nasihat biasa ialah menukar input anda kepada "NFD" sebelum memproses selanjutnya.
Untuk maklumat lebih terperinci, lihathttp://unicode.org/reports/tr15/>.
Unicode Watak Hartanah
(Satu-satunya masa Perl menganggap urutan titik kod individu sebagai satu
watak logik berada dalam binaan "\X", yang telah disebutkan di atas. Oleh itu
"watak" dalam perbincangan ini bermaksud satu titik kod Unicode.)
Hampir semua sifat aksara Unicode boleh diakses melalui ungkapan biasa oleh
menggunakan binaan "\p{}" "matches property" dan "\P{}" "tidak sepadan dengan property" untuk
penafiannya.
Sebagai contoh, "\p{Huruf Besar}" sepadan dengan mana-mana aksara tunggal dengan Unikod "Huruf Besar"
harta, manakala "\p{L}" sepadan dengan mana-mana aksara dengan "Kategori_Umum" bagi "L" (huruf)
harta (lihat "Kategori_Umum" di bawah). Tanda kurung tidak diperlukan untuk satu huruf
nama harta, jadi "\p{L}" adalah bersamaan dengan "\pL".
Secara lebih formal, "\p{Huruf Besar}" sepadan dengan mana-mana aksara tunggal yang Unikodnya "Huruf Besar"
nilai harta ialah "Benar", dan "\P{Huruf Besar}" sepadan dengan mana-mana aksara yang "Huruf Besarnya"
nilai harta ialah "Salah", dan nilai itu boleh ditulis sebagai "\p{Huruf Besar=Benar}" dan
"\p{Uppercase=False}", masing-masing.
Formaliti ini diperlukan apabila sifat bukan binari; iaitu, jika mereka boleh mengambil lebih banyak lagi
nilai daripada sekadar "Benar" dan "Salah". Contohnya, sifat "Bidi_Class" (lihat
"Jenis Aksara Dua Arah" di bawah), boleh mengambil beberapa nilai berbeza, seperti
"Kiri", "Kanan", "Ruang Putih", dan lain-lain. Untuk memadankan ini, seseorang perlu menentukan kedua-duanya
nama harta ("Bidi_Class"), DAN nilai yang dipadankan dengan ("Kiri", "Kanan", dan lain-lain.).
Ini dilakukan, seperti dalam contoh di atas, dengan mempunyai dua komponen dipisahkan dengan sama
tanda (atau secara bergantian, titik bertindih), seperti "\p{Bidi_Class: Left}".
Semua sifat aksara yang ditakrifkan Unikod boleh ditulis dalam bentuk gabungan ini
"\p{property=value}" atau "\p{property:value}", tetapi Perl menyediakan beberapa sifat tambahan
yang ditulis hanya dalam bentuk tunggal, serta pintasan bentuk tunggal untuk semua binari
hartanah dan lain-lain tertentu yang diterangkan di bawah, yang mana anda boleh meninggalkan nama harta dan
yang sama atau pemisah kolon.
Kebanyakan sifat aksara Unicode mempunyai sekurang-kurangnya dua sinonim (atau alias jika anda lebih suka): a
pendek yang lebih mudah untuk ditaip dan yang lebih panjang yang lebih deskriptif dan seterusnya
lebih mudah difahami. Oleh itu sifat "L" dan "Huruf" di atas adalah setara dan boleh
digunakan secara bergantian. Begitu juga, "Upper" ialah sinonim untuk "Uppercase", dan kita boleh
telah menulis "\p{Huruf Besar}" bersamaan dengan "\p{Upper}". Juga, biasanya ada
pelbagai sinonim untuk nilai harta itu boleh. Untuk sifat binari, "Benar" mempunyai 3
sinonim: "T", "Ya", dan "Y"; dan "Salah" mempunyai sepadan "F", "Tidak", dan "N". Tetapi jadilah
berhati-hati. Bentuk pendek nilai untuk satu harta mungkin tidak bermaksud perkara yang sama dengan yang sama
bentuk pendek untuk yang lain. Oleh itu, untuk sifat "General_Category", "L" bermaksud "Surat",
tetapi untuk sifat "Bidi_Class", "L" bermaksud "Kiri". Senarai lengkap hartanah dan
sinonim adalah dalam perluniprops.
Perbezaan huruf besar/kecil dalam nama dan nilai harta adalah tidak relevan; oleh itu "\p{Atas}"
bermaksud perkara yang sama seperti "\p{upper}" atau pun "\p{UpPeR}". Begitu juga, anda boleh menambah atau
tolak garis bawah di mana-mana di tengah-tengah perkataan, supaya ini juga setara
kepada "\p{U_p_p_e_r}". Dan ruang putih tidak relevan bersebelahan dengan aksara bukan perkataan, seperti
sebagai pendakap dan sama atau pemisah kolon, jadi "\p{ Upper }" dan "\p{ Upper_case
: Y }" adalah bersamaan dengan ini juga. Malah, ruang putih dan juga tanda sempang biasanya boleh
ditambah atau dipadamkan di mana-mana sahaja. Jadi walaupun "\p{ Up-per case = Ya}" adalah setara. Semua ini
dipanggil "padanan longgar" oleh Unicode. Beberapa tempat di mana padanan yang lebih ketat digunakan ialah
di tengah nombor dan dalam sifat sambungan Perl yang bermula atau berakhir dengan a
gariskan. Padanan yang lebih ketat mengambil berat tentang ruang putih (kecuali bersebelahan dengan bukan perkataan
aksara), tanda sempang dan garis bawah bukan dalaman.
Anda juga boleh menggunakan penafian dalam kedua-dua "\p{}" dan "\P{}" dengan memperkenalkan karet ("^") antara
pendakap pertama dan nama sifat: "\p{^Tamil}" adalah sama dengan "\P{Tamil}".
Hampir semua sifat kebal kepada padanan tidak sensitif huruf besar-besaran. Iaitu, menambah "/i"
pengubah suai ungkapan biasa tidak mengubah perkara yang dipadankan. Terdapat dua set iaitu
terjejas. Set pertama ialah "Huruf_Uppercase", "Huruf_kecil" dan
"Titlecase_Letter", kesemuanya sepadan dengan "Cased_Letter" di bawah "/i" padanan. Dan yang kedua
set ialah "Huruf Besar", "Huruf Kecil" dan "Huruf Tajuk", semuanya sepadan dengan "Berkas" di bawah "/i"
sepadan. Set ini juga termasuk subsetnya "PosixUpper" dan "PosixLower" yang kedua-duanya
di bawah "/i" padankan "PosixAlpha". (Perbezaan antara set ini ialah beberapa perkara,
seperti angka Rom, datang dalam kedua-dua huruf besar dan kecil supaya ia "Berkas", tetapi tidak
dianggap huruf, jadi ia bukan "Cased_Letter".)
Lihat "Melangkaui mata kod Unicode" untuk pertimbangan khas apabila memadankan Unicode
sifat terhadap titik kod bukan Unikod.
General_Category
Setiap aksara Unicode diberikan kategori umum, iaitu "paling biasa
pengkategorian watak" (darihttp://www.unicode.org/reports/tr44>).
Cara gabungan menulis ini adalah seperti "\p{General_Category=Number}" (pendek:
"\p{gc:n}"). Tetapi Perl memberikan pintasan di mana segala-galanya melalui sama atau
pemisah kolon ditinggalkan. Jadi anda boleh menulis "\pN".
Berikut ialah bentuk pendek dan panjang nilai yang boleh dimiliki oleh sifat "Kategori Umum":
Pendek panjang
L Surat
LC, L& Cased_Letter (iaitu: [\p{Ll}\p{Lu}\p{Lt}])
Huruf_Lu Besar
Ll Huruf_kecil
Lt Titlecase_Letter
Lm Modifier_Letter
Lo Surat_Lain
M Mark
Mn Nonspacing_Mark
Mc Spacing_Mark
Saya Melampirkan_Mark
Nombor N
Nd Decimal_Nombor (juga Digit)
Nl Huruf_Nombor
Tiada Nombor_Lain
P Tanda Baca (juga Punct)
Pc Connector_Punctuation
Pd Dash_Tanda Baca
Ps Open_Punctuation
Pe Tutup_Tanda Baca
Pi Permulaan_Tanda Baca
(mungkin berkelakuan seperti Ps atau Pe bergantung pada penggunaan)
Pf Akhir_Tanda Baca
(mungkin berkelakuan seperti Ps atau Pe bergantung pada penggunaan)
Po Other_Punctuation
Simbol S
Sm Math_Symbol
Sc Mata Wang_Simbol
Sk Modifier_Symbol
Jadi Simbol_Lain
Pemisah Z
Zs Space_Separator
Zl Line_Separator
Zp Perenggan_Separator
C Lain-lain
Kawalan Sk (juga Cntrl)
Cf Format
Cs Pengganti
Co Private_Use
Cn Tidak ditugaskan
Sifat huruf tunggal sepadan dengan semua aksara dalam mana-mana subsifat dua huruf
bermula dengan huruf yang sama. "LC" dan "L&" adalah istimewa: kedua-duanya adalah alias untuk set
terdiri daripada semua yang dipadankan dengan "Ll", "Lu", dan "Lt".
Dua arah Watak jenis
Kerana skrip berbeza dalam arahnya (Ibrani dan Arab ditulis betul-betul untuk
kiri, sebagai contoh) Unicode membekalkan sifat "Bidi_Class". Beberapa nilai ini
harta yang boleh dimiliki ialah:
Makna Nilai
L Kiri-ke-kanan
Pembenaman Kiri-ke-Kanan LRE
Gantikan Kiri-ke-kanan LRO
R Kanan-ke-Kiri
AL Huruf Arab
RLE Benam Kanan-ke-Kiri
RLO Pembatalan Kanan-ke-Kiri
Format Arah Pop PDF
EN Nombor Eropah
ES Pemisah Eropah
ET European Terminator
SEBUAH Nombor Arab
CS Common Separator
Tanda Bukan Jarak NSM
Berkecuali Sempadan BN
B Pemisah Perenggan
Pemisah Segmen S
Ruang Putih WS
ON Lain Neutral
Sifat ini sentiasa ditulis dalam bentuk gabungan. Contohnya, "\p{Bidi_Class:R}"
sepadan dengan aksara yang biasanya ditulis dari kanan ke kiri. Tidak seperti "General_Category"
harta, sifat ini boleh mempunyai lebih banyak nilai ditambah dalam keluaran Unicode akan datang. Itu
yang disenaraikan di atas terdiri daripada set lengkap untuk banyak keluaran Unicode, tetapi yang lain telah ditambah
dalam Unicode 6.3; anda sentiasa boleh mencari kandungan semasa dalam perluniprops. Dan
<http://www.unicode.org/reports/tr9/> menerangkan cara menggunakannya.
skrip
Bahasa-bahasa dunia ditulis dalam banyak skrip yang berbeza. Ayat ini (melainkan anda
membacanya dalam terjemahan) ditulis dalam bahasa Latin, manakala bahasa Rusia ditulis dalam Cyrillic, dan
Greek ditulis dalam, well, Greek; Jepun terutamanya dalam Hiragana atau Katakana. Terdapat banyak
lagi.
Sifat Unicode "Skrip" dan "Skrip_Sambungan" memberikan skrip apa watak tertentu
berada dalam. Sama ada sifat boleh ditentukan dengan bentuk gabungan seperti "\p{Script=Hebrew}"
(pendek: "\p{sc=hebr}"), atau "\p{Script_Extensions=Javanese}" (pendek: "\p{scx=java}"). Dalam
Selain itu, Perl memberikan pintasan untuk semua nama sifat "Skrip". Anda boleh tinggalkan
semuanya melalui sama dengan (atau bertindih), dan hanya tulis "\p{Latin}" atau
"\P{Cyrillic}". (Ini tidak benar untuk "Script_Extensions", yang diperlukan
ditulis dalam bentuk gabungan.)
Perbezaan antara kedua-dua sifat ini melibatkan aksara yang digunakan dalam berbilang
skrip. Contohnya digit '0' hingga '9' digunakan di banyak bahagian dunia.
Ini diletakkan dalam skrip bernama "Common". Watak lain digunakan dalam beberapa sahaja
skrip. Contohnya, "KATAKANA-HIRAGANA DOUBLE HYPHEN" digunakan dalam kedua-dua bahasa Jepun
skrip, Katakana dan Hiragana, tetapi tidak di tempat lain. Harta "Skrip" meletakkan semua
aksara yang digunakan dalam berbilang skrip dalam skrip "Umum", manakala
Harta "Script_Extensions" meletakkan mereka yang digunakan dalam beberapa skrip sahaja ke dalam setiap skrip
skrip tersebut; sementara masih menggunakan "Common" untuk yang digunakan dalam banyak skrip. Oleh itu kedua-dua ini
padanan:
"0" =~ /\p{sc=Common}/ # Padanan
"0" =~ /\p{scx=Common}/ # Padanan
dan hanya perlawanan pertama ini:
"\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ /\p{sc=Common} # Padanan
"\N{KATAKANA-HIRAGANA DOUBLE HYPHEN}" =~ /\p{scx=Common} # Tiada padanan
Dan hanya dua perlawanan terakhir ini:
"\N{KATAKANA-HIRAGANA GANDA SENGGARA}" =~ /\p{sc=Hiragana} # Tiada padanan
"\N{KATAKANA-HIRAGANA DOUBLE GANDA}" =~ /\p{sc=Katakana} # Tiada padanan
"\N{KATAKANA-HIRAGANA GANDA SENGGARA}" =~ /\p{scx=Hiragana} # Padanan
"\N{KATAKANA-HIRAGANA DOUBLE GANDA}" =~ /\p{scx=Katakana} # Padanan
Oleh itu, "Skrip_Sambungan" ialah "Skrip" yang dipertingkatkan di mana terdapat lebih sedikit aksara
skrip "Umum", dan sejajar dengan skrip lain. Ia baharu dalam Unicode
versi 6.0, dan datanya mungkin berubah dengan ketara dalam keluaran kemudian, sebagai perkara
diselesaikan. Kod baharu mungkin menggunakan "Script_Extensions" dan tidak biasa
"Skrip".
(Sebenarnya, selain "Biasa", skrip "Diwarisi", mengandungi aksara yang digunakan dalam
berbilang skrip. Ini adalah aksara pengubah suai yang mewarisi nilai skrip
watak mengawal. Sebahagian daripada ini digunakan dalam banyak skrip, dan seterusnya pergi ke "Diwarisi"
dalam kedua-dua "Skrip" dan "Skrip_Sambungan". Yang lain digunakan hanya dalam beberapa skrip, begitu juga
dalam "Diwarisi" dalam "Skrip", tetapi bukan dalam "Skrip_Sambungan".)
Perlu ditekankan bahawa terdapat beberapa set digit yang berbeza dalam Unicode
bersamaan dengan 0-9 dan boleh dipadankan dengan "\d" dalam ungkapan biasa. Jika ia digunakan dalam
satu bahasa sahaja, ia berada dalam "Skrip" dan "Skrip_Sambungan" bahasa itu. Jika
ia digunakan dalam lebih daripada satu skrip, ia akan berada dalam "sc=Common", tetapi hanya jika ada
digunakan dalam banyak skrip sekiranya ia berada dalam "scx=Common".
Senarai lengkap skrip dan jalan pintasnya terdapat dalam perluniprops.
Penggunaan of yang "Adakah" Awalan
Untuk keserasian ke belakang (dengan Perl 5.6), semua sifat boleh ditulis tanpa menggunakan
bentuk majmuk yang disebut setakat ini mungkin mempunyai "Adalah" atau "Adalah_" yang ditambahkan pada nama mereka, jadi
"\P{Is_Lu}", sebagai contoh, adalah sama dengan "\P{Lu}", dan "\p{IsScript:Arabic}" adalah sama dengan
"\p{Bahasa Arab}".
Blok
Di samping skrip, Unicode juga mentakrifkan blok daripada watak. Perbezaan antara
skrip dan blok ialah konsep skrip lebih dekat dengan bahasa semula jadi, manakala
konsep blok adalah lebih kepada kumpulan buatan berdasarkan kumpulan Unicode
aksara dengan nilai ordinal berturut-turut. Sebagai contoh, blok "Basic Latin" adalah semua
aksara yang ordinalnya antara 0 dan 127, termasuk; dengan kata lain, ASCII
watak. Skrip "Latin" mengandungi beberapa huruf daripada ini dan juga beberapa huruf lain
blok, seperti "Latin-1 Supplement", "Latin Extended-A", dan lain-lain., tetapi ia tidak mengandungi semua
watak-watak daripada blok tersebut. Ia tidak, sebagai contoh, mengandungi digit 0-9,
kerana digit tersebut dikongsi merentas banyak skrip, dan oleh itu berada dalam skrip "Biasa".
Untuk lebih lanjut mengenai skrip berbanding blok, lihat UAX#24 "Harta Skrip Unicode":
<http://www.unicode.org/reports/tr24>
Sifat "Skrip" atau "Skrip_Sambungan" berkemungkinan besar yang anda mahu gunakan
apabila memproses bahasa semula jadi; sifat "Sekat" kadangkala boleh berguna dalam
bekerja dengan nat dan bolt Unicode.
Nama blok dipadankan dalam bentuk gabungan, seperti "\p{Block: Arrows}" atau
"\p{Blk=Ibrani}". Tidak seperti kebanyakan sifat lain, hanya beberapa nama blok yang mempunyai Unicode-
nama pendek yang ditakrifkan. Tetapi Perl menyediakan pintasan (sedikit, tidak disyorkan lagi):
Anda boleh menyebut, contohnya "\p{In_Arrows}" atau "\p{In_Hebrew}".
Untuk keserasian ke belakang, awalan "In" boleh ditinggalkan jika tiada konflik penamaan
dengan skrip atau mana-mana harta lain, dan anda juga boleh menggunakan awalan "Adalah" sebagai gantinya
kes. Tetapi jangan lakukan ini untuk kod baharu kerana kod anda boleh pecah dalam keluaran baharu dan
ini telah pun berlaku: Terdapat masa dalam keluaran Unicode yang sangat awal apabila
"\p{Hebrew}" akan sepadan dengan menyekat bahasa Ibrani; sekarang tidak.
Menggunakan awalan "Dalam" mengelakkan kekaburan ini, setakat ini. Tetapi versi baharu Unicode diteruskan
untuk menambah sifat baharu yang namanya bermula dengan "Dalam". Terdapat kemungkinan bahawa salah satu daripada
mereka suatu hari nanti akan bercanggah dengan penggunaan anda. Memandangkan ini hanyalah sambungan Perl,
Nama Unicode akan diutamakan dan kod anda akan rosak. Juga, Unicode ialah
bebas untuk menambah skrip yang namanya bermula dengan "Dalam"; yang akan menimbulkan masalah.
Jadi lebih jelas dan terbaik untuk menggunakan bentuk kompaun apabila menentukan blok. Dan pastikan
itulah yang anda benar-benar mahu lakukan. Dalam kebanyakan kes, skrip adalah perkara yang anda mahukan
sebaliknya.
Senarai lengkap blok dan jalan pintasnya terdapat dalam perluniprops.
lain-lain Hartanah
Terdapat lebih banyak sifat daripada yang sangat asas yang diterangkan di sini. Senarai lengkap
terdapat dalam perluniprops.
Unicode mentakrifkan semua sifatnya dalam bentuk majmuk, jadi semua sifat bentuk tunggal adalah
Sambungan Perl. Kebanyakan ini hanyalah sinonim untuk Unicode, tetapi ada yang begitu
sambungan tulen, termasuk beberapa yang dalam bentuk gabungan. Dan agak sedikit daripada
ini sebenarnya disyorkan oleh Unicode (dalamhttp://www.unicode.org/reports/tr18>).
Bahagian ini memberikan beberapa butiran tentang semua sambungan yang bukan sahaja sinonim untuk kompaun-
bentuk sifat Unicode (untuk sifat tersebut, anda perlu merujuk kepada Unicode
Standardhttp://www.unicode.org/reports/tr44>.
"\p{Semua}"
Ini sepadan dengan setiap titik kod yang mungkin. Ia bersamaan dengan "qr/./s". Tidak seperti semua
padanan sifat "\p{}" bukan pengguna yang lain, tiada amaran akan dihasilkan jika ini
adalah harta dipadankan dengan titik kod bukan Unikod (lihat "Melangkaui kod Unikod
mata" di bawah).
"\p{Alnum}"
Ini sepadan dengan mana-mana aksara "\p{Alphabetic}" atau "\p{Decimal_Nomber}".
"\p{Mana-mana}"
Ini sepadan dengan mana-mana titik kod Unicode 1_114_112. Ia adalah sinonim untuk
"\p{Unicode}".
"\p{ASCII}"
Ini sepadan dengan mana-mana daripada 128 aksara dalam set aksara AS-ASCII, iaitu a
subset Unicode.
"\p{Ditugaskan}"
Ini sepadan dengan mana-mana titik kod yang ditetapkan; iaitu, mana-mana titik kod yang kategori amnya
bukan "Tidak ditugaskan" (atau yang setara, bukan "Cn").
"\p{Kosong}"
Ini adalah sama seperti "\h" dan "\p{HorizSpace}": Aksara yang menukar jarak
melintang.
"\p{Decomposition_Type: Bukan_Kanonik}" (Pendek: "\p{Dt=NonCanon}")
Padan dengan watak yang mempunyai penguraian bukan kanonik.
Bahagian "Kluster Grapheme Lanjutan (Aksara logik)" di atas bercakap tentang
penguraian kanonik. Walau bagaimanapun, banyak lagi watak mempunyai jenis yang berbeza
penguraian, penguraian "serasi" atau "bukan kanonik". Urutan yang
membentuk penguraian ini tidak dianggap setara secara kanonik dengan pra-
watak tersusun. Contohnya ialah "SUPERSCRIPT ONE". Ia agak seperti a
digit biasa 1, tetapi tidak betul-betul; penguraiannya kepada digit 1 dipanggil a
penguraian "serasi", khususnya penguraian "super". Terdapat beberapa
penguraian keserasian sedemikian (lihathttp://www.unicode.org/reports/tr44>),
termasuk satu yang dipanggil "compat", yang bermaksud beberapa jenis pelbagai penguraian
yang tidak sesuai dengan kategori penguraian lain yang telah dipilih oleh Unicode.
Ambil perhatian bahawa kebanyakan aksara Unicode tidak mempunyai penguraian, jadi penguraiannya
jenis ialah "Tiada".
Untuk kemudahan anda, Perl telah menambah jenis penguraian "Non_Canonical" kepada maksud
mana-mana daripada beberapa penguraian keserasian.
"\p{Graf}"
Padan dengan mana-mana aksara yang berbentuk grafik. Secara teorinya, ini bermakna watak yang pada
pencetak akan menyebabkan dakwat digunakan.
"\p{HorizSpace}"
Ini adalah sama seperti "\h" dan "\p{Kosong}": aksara yang menukar jarak
melintang.
"\p{In=*}"
Ini adalah sinonim untuk "\p{Present_In=*}"
"\p{PerlSpace}"
Ini adalah sama seperti "\s", terhad kepada ASCII, iaitu "[ \f\n\r\t]" dan bermula dalam
Perl v5.18, tab menegak.
Mnemonik: ruang Perl (asal).
"\p{PerlWord}"
Ini adalah sama seperti "\w", terhad kepada ASCII, iaitu "[A-Za-z0-9_]"
Mnemonik: perkataan Perl (asal).
"\p{Posix...}"
Terdapat beberapa daripada ini, yang setara, menggunakan tatatanda "\p{}", untuk
kelas Posix dan diterangkan dalam "Kelas Aksara POSIX" dalam perlrecharclass.
"\p{Present_In: *}" (Pendek: "\p{In=*}")
Sifat ini digunakan apabila anda perlu mengetahui dalam versi Unicode sesuatu aksara.
"*" di atas bermaksud nombor versi Unicode dua digit, seperti 1.1 atau 4.0; atau
"*" juga boleh menjadi "Tidak ditugaskan". Sifat ini akan sepadan dengan titik kod yang
pelupusan akhir telah diselesaikan sejak keluaran Unicode yang diberikan oleh versi
nombor; "\p{Present_In: Unassigned}" akan sepadan dengan titik kod yang mempunyai makna
belum ditugaskan.
Contohnya, "U+0041" "HURUF BESAR LATIN A" terdapat dalam Unicode yang pertama
keluaran tersedia, iaitu 1.1, jadi sifat ini benar untuk semua versi "*" yang sah.
Sebaliknya, "U+1EFF" tidak diberikan sehingga versi 5.1 apabila ia menjadi "LATIN
HURUF KECIL Y DENGAN LOOP", jadi satu-satunya "*" yang sepadan dengannya ialah 5.1, 5.2 dan
kemudian.
Unicode memberikan sifat "Umur" dari mana ini diperoleh. Masalah dengan Umur
ialah tafsiran yang ketat mengenainya (yang diambil oleh Perl) telah memadankannya dengan tepat
lepaskan maksud titik kod diperkenalkan. Oleh itu, "U+0041" hanya sepadan dengan 1.1;
dan "U+1EFF" hanya 5.1. Ini biasanya bukan yang anda mahukan.
Sesetengah pelaksanaan bukan Perl bagi sifat Age mungkin menukar maksudnya menjadi
sama seperti harta Perl "Present_In"; sedar sahaja itu.
Satu lagi kekeliruan dengan kedua-dua sifat ini ialah definisinya bukanlah bahawa
titik kod telah ditugaskan, tetapi maksud titik kod itu ialah
ditentukan. Ini kerana 66 mata kod akan sentiasa tidak diberikan, dan seterusnya
"Umur" bagi mereka ialah versi Unicode di mana keputusan untuk membuat mereka sedemikian telah dibuat.
Sebagai contoh, "U+FDD0" tidak akan diberikan secara kekal kepada watak dan keputusannya
untuk melakukannya telah dibuat dalam versi 3.1, jadi "\p{Age=3.1}" sepadan dengan watak ini, begitu juga
adakah "\p{Present_In: 3.1}" dan ke atas.
"\p{Cetak}"
Ini sepadan dengan mana-mana aksara yang berbentuk grafik atau kosong, kecuali kawalan.
"\p{SpacePerl}"
Ini sama dengan "\s", termasuk di luar ASCII.
Mnemonik: Angkasa, seperti yang diubah suai oleh Perl. (Ia tidak termasuk tab menegak sehingga
v5.18, yang kedua-dua piawai Posix dan Unicode anggap ruang putih.)
"\p{Tajuk}" and "\p{Kes tajuk}"
Di bawah padanan sensitif huruf besar-besaran, kedua-duanya sepadan dengan titik kod yang sama seperti "\p{General
Category=Titlecase_Letter}" ("\p{gc=lt}"). Perbezaannya ialah di bawah "/i" caseless
sepadan, ini sepadan sama seperti "\p{Cased}", manakala "\p{gc=lt}" sepadan
"\p{Surat_Berkas").
"\p{Unicode}"
Ini sepadan dengan mana-mana titik kod Unicode 1_114_112. "\p{Mana-mana}".
"\p{VertSpace}"
Ini adalah sama dengan "\v": Aksara yang menukar jarak secara menegak.
"\p{Perkataan}"
Ini adalah sama seperti "\w", termasuk lebih 100_000 aksara di luar ASCII.
"\p{XPosix...}"
Terdapat beberapa daripada ini, yang merupakan kelas Posix standard yang dilanjutkan sepenuhnya
Julat Unicode. Mereka diterangkan dalam "Kelas Aksara POSIX" dalam perlrecharclass.
Ditentukan oleh Pengguna Watak Hartanah
Anda boleh menentukan sifat aksara binari anda sendiri dengan mentakrifkan subrutin yang namanya
bermula dengan "In" atau "Is". (Ciri percubaan "(?[ ])" dalam perlre menyediakan
alternatif yang membolehkan definisi yang lebih kompleks.) Subrutin boleh ditakrifkan dalam mana-mana
pakej. Sifat yang ditentukan pengguna boleh digunakan dalam ungkapan biasa "\p{}" dan
"\P{}" binaan; jika anda menggunakan harta yang ditentukan pengguna daripada pakej selain daripada
yang anda sertai, anda mesti menentukan pakejnya dalam binaan "\p{}" atau "\P{}".
# menganggap harta Is_Foreign ditakrifkan dalam Lang::
pakej utama; # nama pakej harta diperlukan
if ($txt =~ /\p{Lang::IsForeign}+/) { ... }
pakej Lang; # nama pakej hartanah tidak diperlukan
jika ($txt =~ /\p{IsForeign}+/) { ... }
Ambil perhatian bahawa kesannya adalah masa penyusunan dan tidak boleh diubah setelah ditentukan. Walau bagaimanapun, subrutin
lulus satu parameter, iaitu 0 jika padanan sensitif huruf besar berkuat kuasa dan tidak
sifar jika pemadanan tanpa huruf berkuat kuasa. Subrutin mungkin mengembalikan nilai yang berbeza
bergantung pada nilai bendera, dan satu set nilai akan berkuat kuasa secara kekal untuk
semua padanan sensitif huruf besar dan satu lagi set untuk semua padanan tidak sensitif huruf besar.
Ambil perhatian bahawa jika ungkapan biasa tercemar, maka Perl akan mati daripada memanggil
subrutin apabila nama subrutin ditentukan oleh data yang tercemar.
Subrutin mesti mengembalikan rentetan yang diformat khas, dengan satu atau lebih baris baharu-
garisan terpisah. Setiap baris mestilah salah satu daripada yang berikut:
· Nombor perenambelasan tunggal yang menandakan titik kod untuk dimasukkan.
· Dua nombor perenambelasan dipisahkan oleh ruang putih mendatar (ruang atau jadual
aksara) menandakan julat titik kod untuk disertakan.
· Sesuatu untuk disertakan, diawali dengan "+": sifat aksara terbina dalam (diawalan oleh
"utf8::") atau aksara yang ditetapkan pengguna yang layak sepenuhnya (termasuk nama pakej).
harta, untuk mewakili semua watak dalam harta itu; dua kod perenambelasan
mata untuk julat; atau satu titik kod heksadesimal.
· Sesuatu untuk dikecualikan, diawali dengan "-": sifat aksara sedia ada (diawalan oleh
"utf8::") atau aksara yang ditetapkan pengguna yang layak sepenuhnya (termasuk nama pakej).
harta, untuk mewakili semua watak dalam harta itu; dua kod perenambelasan
mata untuk julat; atau satu titik kod heksadesimal.
· Sesuatu untuk menafikan, diawali "!": sifat aksara sedia ada (diawalan oleh
"utf8::") atau aksara yang ditetapkan pengguna yang layak sepenuhnya (termasuk nama pakej).
harta, untuk mewakili semua watak dalam harta itu; dua kod perenambelasan
mata untuk julat; atau satu titik kod heksadesimal.
· Sesuatu untuk bersilang dengan, diawali dengan "&": sifat aksara sedia ada (diawalan
oleh "utf8::") atau aksara yang ditetapkan pengguna yang layak sepenuhnya (termasuk nama pakej)
harta, untuk semua watak kecuali watak dalam harta; dua
mata kod heksadesimal untuk julat; atau satu titik kod heksadesimal.
Sebagai contoh, untuk menentukan sifat yang merangkumi kedua-dua suku kata Jepun (hiragana dan
katakana), anda boleh menentukan
sub InKana {
kembali <
3040\t309F
30A0\t30FF
AKHIR
}
Bayangkan bahawa penanda akhir di sini-doc berada di permulaan baris. Sekarang anda boleh menggunakan
"\p{InKana}" dan "\P{InKana}".
Anda juga boleh menggunakan nama sifat blok sedia ada:
sub InKana {
kembali <<'TAMAT';
+utf8::InHiragana
+utf8::InKatakana
AKHIR
}
Katakan anda mahu memadankan hanya aksara yang diperuntukkan, bukan julat blok mentah: in
erti kata lain, anda ingin mengalih keluar aksara yang tidak ditetapkan:
sub InKana {
kembali <<'TAMAT';
+utf8::InHiragana
+utf8::InKatakana
-utf8::IsCn
AKHIR
}
Penafian berguna untuk menentukan (mengejutkan!) kelas yang dinafikan.
sub InNotKana {
kembali <<'TAMAT';
!utf8::InHiragana
-utf8::InKatakana
+utf8::IsCn
AKHIR
}
Ini akan sepadan dengan semua titik kod bukan Unicode, kerana setiap satu daripadanya tiada dalam Kana. awak
boleh menggunakan persimpangan untuk mengecualikan ini, jika dikehendaki, kerana contoh yang diubah suai ini menunjukkan:
sub InNotKana {
kembali <<'TAMAT';
!utf8::InHiragana
-utf8::InKatakana
+utf8::IsCn
&utf8::Mana-mana
AKHIR
}
&utf8::Mana-mana mestilah baris terakhir dalam takrifan.
Persimpangan digunakan secara amnya untuk mendapatkan aksara biasa dipadankan oleh dua (atau lebih)
kelas. Adalah penting untuk diingat untuk tidak menggunakan "&" untuk set pertama; itu akan menjadi
bersilang dengan apa-apa, menghasilkan set kosong.
Tidak seperti padanan sifat "\p{}" yang tidak ditentukan pengguna, tiada amaran akan dijana jika ini
sifat dipadankan dengan titik kod bukan Unicode (lihat "Melebihi titik kod Unicode"
di bawah).
Ditentukan oleh Pengguna kes Pemetaan (Untuk serius penggodam sahaja)
ini ciri mempunyai menjadi dikeluarkan as of Perl 5.16. Modul CPAN "Unicode::Casing" menyediakan
kefungsian yang lebih baik tanpa kelemahan ciri ini. Jika anda menggunakan Perl
lebih awal daripada 5.16, ciri ini paling banyak didokumentasikan dalam versi 5.14 pod ini:
<http://perldoc.perl.org/5.14.0/perlunicode.html#User-Defined-Case-Mappings-%28for-serious-hackers-only%29>
Watak Pengekodan khususnya Input and Output
Lihat Pengekodan.
Unicode Biasa ungkapan Khidmat Bantuan Tahap
Senarai ciri yang disokong Unicode berikut untuk ungkapan biasa menerangkan semuanya
ciri yang kini disokong secara langsung oleh teras Perl. Rujukan kepada "Tahap N" dan
nombor bahagian merujuk kepada Piawaian Teknikal Unicode #18, "Unicode Regular
Expressions", versi 13, dari Ogos 2008.
· Tahap 1 - Sokongan Unicode Asas
Notasi Hex RL1.1 - selesai [1]
RL1.2 Properties - selesai [2][3]
RL1.2a Sifat Keserasian - selesai [4]
RL1.3 Penolakan dan Persilangan - percubaan [5]
RL1.4 Sempadan Perkataan Mudah - selesai [6]
Padanan Longgar Mudah RL1.5 - selesai [7]
Sempadan Talian RL1.6 - HILANG [8][9]
RL1.7 Mata Kod Tambahan - selesai [10]
[1] "\N{U+...}" dan "\x{...}"
[2] "\p{...}" "\P{...}"
[3] menyokong bukan sahaja senarai minimum, tetapi semua sifat aksara Unicode (lihat Unicode
Sifat Watak di atas)
[4] "\d" "\D" "\s" "\S" "\w" "\W" "\X" "[:prop:]" "[:^prop:]"
[5] Ciri percubaan bermula dalam v5.18 "(?[...])" mencapai ini.
Lihat "(?[ ])" dalam perlre. Jika anda tidak mahu menggunakan ciri percubaan, anda boleh
gunakan salah satu daripada yang berikut:
· Ekspresi biasa memandang ke hadapan
Anda boleh meniru penolakan kelas menggunakan lookahead. Contohnya, apa UTS#18
mungkin menulis sebagai
[{Blok=Greek}-[{UNSIGNED}]]
dalam Perl boleh ditulis sebagai:
(?!\p{Tidak Ditugaskan})\p{Blok=Greek}
(?=\p{Ditugaskan})\p{Blok=Greek}
Tetapi dalam contoh khusus ini, anda mungkin benar-benar mahu
\p{Bahasa Yunani}
yang akan sepadan dengan aksara yang ditetapkan yang diketahui sebagai sebahagian daripada skrip Yunani.
· Modul CPAN "Unicode:: Regex:: Set"
Ia melaksanakan pengelompokan UTS#18 penuh, persimpangan, kesatuan dan penyingkiran
(penolakan) sintaks.
· "Sifat Watak Ditentukan Pengguna"
"+" untuk kesatuan, "-" untuk penyingkiran (set-perbezaan), "&" untuk persimpangan
[6] "\b" "\B"
[7] Ambil perhatian bahawa Perl melakukan lipatan huruf penuh dalam padanan, bukan Mudah:
Contohnya "U+1F88" bersamaan dengan "U+1F00 U+03B9", bukannya hanya "U+1F80".
Perbezaan ini penting terutamanya untuk huruf besar Yunani tertentu dengan tertentu
pengubah suai: lipatan huruf penuh menguraikan huruf, manakala huruf ringkas-
lipatan akan memetakannya kepada satu aksara.
[8] Perl menganggap "\n" sebagai pembatas baris mula dan akhir. Unicode menentukan lebih banyak lagi
watak-watak yang sepatutnya ditafsirkan.
Ini adalah:
VT U+000B (\v dalam C)
FF U+000C (\f)
CR U+000D (\r)
NEL U+0085
LS U+2028
PS U+2029
"^" dan "$" dalam corak ungkapan biasa sepatutnya sepadan dengan semua ini, tetapi
jangan. Aksara ini juga tidak, tetapi harus, mempengaruhi "<>" $., dan baris skrip
nombor.
Juga, baris tidak boleh dipisahkan dalam "CRLF" (iaitu tiada baris kosong antara
"\r" dan "\n"). Untuk "CRLF", cuba lapisan ":crlf" (lihat PerlIO).
[9] Tetapi "Unicode::LineBreak" tersedia.
Modul ini membekalkan pematuhan pemutusan baris dengan UAX#14 "Pemutus Talian Unicode
Algoritma"http://www.unicode.org/reports/tr14>.
[10] UTF-8/UTF-EBDDIC yang digunakan dalam Perl membenarkan bukan sahaja "U+10000" kepada "U+10FFFF" tetapi juga
melebihi "U+10FFFF"
· Tahap 2 - Sokongan Unicode Lanjutan
RL2.1 Setara Kanonik - HILANG [10][11]
Kluster Grafem Lalai RL2.2 - HILANG [12]
RL2.3 Sempadan Kata Lalai - SELESAI [14]
RL2.4 Padanan Longgar Lalai - HILANG [15]
RL2.5 Nama Sifat - SELESAI
RL2.6 Sifat Kad Liar - HILANG
[10] lihat UAX#15 "Borang Normalisasi Unikod"
[11] mempunyai Unicode::Normalize tetapi tidak disepadukan dengan regex
[12] mempunyai \X dan \b{gcb} tetapi kami tidak mempunyai "Kluster Graf
Mod"
[14] lihat UAX#29, Word Boundaries
[15] Ini diliputi dalam Bab 3.13 (dalam Unicode 6.0)
· Tahap 3 - Sokongan Disesuaikan
RL3.1 Tanda Baca Disesuaikan - HILANG
Kluster Grafem Tersuai RL3.2 - HILANG [17][18]
RL3.3 Sempadan Perkataan Tersuai - HILANG
Padanan Longgar Tersuai RL3.4 - HILANG
Julat Tersuai RL3.5 - HILANG
RL3.6 Padanan Konteks - HILANG [19]
Perlawanan Tambahan RL3.7 - HILANG
( Perkongsian Set Unicode RL3.8 )
RL3.9 Set Padanan Kemungkinan - HILANG
Padanan Lipat RL3.10 - HILANG [20]
RL3.11 Submatchers - HILANG
[17] lihat UAX#10 "Algoritma Pengumpulan Unikod"
[18] mempunyai Unicode::Collate tetapi tidak disepadukan dengan regex
[19] mempunyai (?<=x) dan (?=x), tetapi melihat ke hadapan atau melihat ke belakang
harus melihat di luar subrentetan sasaran
[20] memerlukan padanan yang tidak sensitif untuk ciri linguistik yang lain
daripada kes; contohnya hiragana ke katakana, lebar dan
sempit, Han dipermudahkan kepada Han tradisional (lihat UTR#30
"Lipatan Watak")
Unicode Pengekodan
Aksara Unicode diberikan kepada kod mata, iaitu nombor abstrak. Untuk menggunakan ini
nombor, pelbagai pengekodan diperlukan.
· UTF-8
UTF-8 ialah pembolehubah panjang (1 hingga 4 bait), pengekodan bebas pesanan bait. Dalam kebanyakan
daripada dokumentasi Perl, termasuk di tempat lain dalam dokumen ini, istilah "UTF-8" bermaksud
juga "UTF-EBCDIC". Tetapi dalam bahagian ini, "UTF-8" hanya merujuk kepada pengekodan yang digunakan pada
platform ASCII. Ia ialah superset 7-bit US-ASCII, jadi apa-apa yang dikodkan dalam ASCII ada
perwakilan yang sama apabila dikodkan dalam UTF-8.
Jadual berikut adalah daripada Unicode 3.2.
Mata Kod Bait Pertama Bait Ke-1 Bait Ke-2 Bait Ke-3
U+0000..U+007F 00..7F
U+0080..U+07FF * C2..DF 80..BF
U+0800..U+0FFF E0 * A0..BF 80..BF
U+1000..U+CFFF E1..EC 80..BF 80..BF
U+D000..U+D7FF ED 80..9F 80..BF
U+D800..U+DFFF +++++ pengganti utf16, bukan utf8 +++++ yang sah
U+E000..U+FFFF EE..EF 80..BF 80..BF
U+10000..U+3FFFF F0 * 90..BF 80..BF 80..BF
U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF
U+100000..U+10FFFF F4 80..8F 80..BF 80..BF
Perhatikan jurang yang ditandakan dengan "*" sebelum beberapa entri bait di atas. Ini adalah
disebabkan oleh UTF-8 undang-undang mengelakkan pengekodan bukan terpendek: secara teknikalnya mungkin untuk
UTF-8-mengkodkan satu titik kod dengan cara yang berbeza, tetapi itu dilarang secara jelas,
dan pengekodan yang sesingkat mungkin harus sentiasa digunakan (dan itulah yang Perl lakukan).
Cara lain untuk melihatnya adalah melalui bit:
Mata Kod Bait Pertama Bait Ke-1 Bait Ke-2 Bait Ke-3
0aaaaaaa 0aaaaaaaa
00000bbbbaaaaa 110bbbbb 10aaaaa
ccccbbbbbbaaaaa 1110cccc 10bbbbbb 10aaaaa
00000dddccccccbbbbbbaaaaa 11110ddd 10cccccc 10bbbbbb 10aaaaa
Seperti yang anda lihat, bait kesinambungan semuanya bermula dengan "10", dan bit utama bagi
bait permulaan memberitahu berapa banyak bait yang terdapat dalam aksara yang dikodkan.
Spesifikasi UTF-8 asal membenarkan sehingga 6 bait, untuk membenarkan pengekodan nombor
sehingga "0x7FFF_FFFF". Perl terus membenarkannya, dan telah melanjutkannya sehingga 13
bait untuk mengekod kod menunjuk kepada perkara yang boleh dimuatkan dalam perkataan 64-bit. Walau bagaimanapun, Perl akan
memberi amaran jika anda mengeluarkan mana-mana daripada ini sebagai tidak mudah alih; dan di bawah input UTF-8 yang ketat
protokol, mereka dilarang.
· UTF-EBCDIC
Seperti UTF-8, tetapi EBCDIC-selamat, dengan cara UTF-8 adalah ASCII-selamat. Ini bermakna semua
aksara asas (yang merangkumi semua yang mempunyai persamaan ASCII (seperti "A",
"0", "%", dan lain-lain.) adalah sama dalam kedua-dua EBCDIC dan UTF-EBCDIC.)
UTF-EBCDIC digunakan pada platform EBCDIC. Titik kod Unicode terbesar mengambil masa 5 bait
untuk mewakili (bukannya 4 dalam UTF-8), dan Perl memanjangkannya kepada maksimum 7 bait kepada
encode pode menunjuk kepada perkara yang boleh dimuatkan dalam perkataan 32-bit (bukannya 13 bait dan
perkataan 64-bit dalam UTF-8).
· UTF-16, UTF-16BE, UTF-16LE, Pengganti dan "BOM" (Markah Pesanan Bait)
Item berikut kebanyakannya untuk rujukan dan pengetahuan Unicode am, Perl
tidak menggunakan binaan ini secara dalaman.
Seperti UTF-8, UTF-16 ialah pengekodan lebar boleh ubah, tetapi di mana UTF-8 menggunakan kod 8-bit
unit, UTF-16 menggunakan unit kod 16-bit. Semua titik kod menduduki sama ada 2 atau 4 bait masuk
UTF-16: titik kod "U+0000..U+FFFF" disimpan dalam unit 16-bit tunggal dan kod
mata "U+10000..U+10FFFF" dalam dua unit 16-bit. Kes terakhir menggunakan pengganti,
unit 16-bit pertama ialah tinggi tumpang, dan yang kedua ialah rendah
tumpang.
Pengganti ialah titik kod yang diketepikan untuk mengekod julat "U+10000..U+10FFFF" bagi
Titik kod Unicode dalam pasangan unit 16-bit. The tinggi pengganti ialah julat
"U+D800..U+DBFF" dan rendah pengganti ialah julat "U+DC00..U+DFFF". Pengganti
pengekodan adalah
$hi = ($uni - 0x10000) / 0x400 + 0xD800;
$lo = ($uni - 0x10000) % 0x400 + 0xDC00;
dan penyahkodannya ialah
$uni = 0x10000 + ($hi - 0xD800) * 0x400 + ($lo - 0xDC00);
Kerana 16-bitness, UTF-16 bergantung pada pesanan bait. UTF-16 sendiri boleh digunakan
untuk pengiraan dalam ingatan, tetapi jika penyimpanan atau pemindahan diperlukan sama ada UTF-16BE
Pengekodan (big-endian) atau UTF-16LE (little-endian) mesti dipilih.
Ini memperkenalkan masalah lain: bagaimana jika anda hanya tahu bahawa data anda ialah UTF-16, tetapi
anda tidak tahu endianness yang mana? Markah Pesanan Byte, atau "BOM", adalah penyelesaian kepada
ini. Satu aksara khas telah dikhaskan dalam Unicode untuk berfungsi sebagai susunan bait
penanda: watak dengan titik kod "U+FEFF" ialah "BOM".
Caranya ialah jika anda membaca "BOM", anda akan mengetahui susunan bait, kerana jika ia
ditulis pada platform big-endian, anda akan membaca bait "0xFE 0xFF", tetapi jika ia
ditulis pada platform little-endian, anda akan membaca bait "0xFF 0xFE". (Dan jika
platform asal sedang menulis dalam platform ASCII UTF-8, anda akan membaca bait
"0xEF 0xBB 0xBF".)
Cara helah ini berfungsi ialah watak dengan titik kod "U+FFFE" tidak
sepatutnya berada dalam aliran input, jadi urutan bait "0xFF 0xFE" adalah jelas
""BOM", diwakili dalam format little-endian" dan tidak boleh "U+FFFE", diwakili dalam
format big-endian".
Pengganti tidak mempunyai makna dalam Unicode di luar penggunaannya secara berpasangan untuk mewakili orang lain
mata kod. Walau bagaimanapun, Perl membenarkan mereka diwakili secara individu secara dalaman, untuk
contoh dengan berkata "b.c(0xD801)", supaya semua titik kod, bukan hanya yang sah untuk
pertukaran terbuka, boleh diwakili. Unicode tidak mentakrifkan semantik untuk mereka, seperti
"Kategori_Umum" mereka ialah "Cs". Tetapi kerana penggunaannya agak berbahaya, Perl
akan memberi amaran (menggunakan kategori amaran "pengganti", yang merupakan subkategori "utf8")
jika percubaan dibuat untuk melakukan perkara seperti mengambil huruf kecil satu, atau padankan huruf besar-
secara tidak sensitif, atau untuk mengeluarkannya. (Tetapi jangan cuba ini pada Perls sebelum 5.14.)
· UTF-32, UTF-32BE, UTF-32LE
Keluarga UTF-32 hampir seperti keluarga UTF-16, kecuali unitnya
32-bit, dan oleh itu skim pengganti tidak diperlukan. UTF-32 ialah lebar tetap
pengekodan. Tandatangan "BOM" ialah "0x00 0x00 0xFE 0xFF" untuk BE dan "0xFF 0xFE 0x00
0x00" untuk LE.
· UCS-2, UCS-4
Pengekodan legasi, lebar tetap yang ditakrifkan oleh standard ISO 10646. UCS-2 ialah 16-bit
pengekodan. Tidak seperti UTF-16, UCS-2 tidak boleh dipanjangkan melebihi "U+FFFF", kerana ia tidak
menggunakan pengganti. UCS-4 ialah pengekodan 32-bit, fungsinya sama dengan UTF-32 (the
perbezaannya ialah UCS-4 tidak melarang pengganti atau mata kod yang lebih besar daripada
"0x10_FFFF").
· UTF-7
Pengekodan selamat tujuh-bit (bukan lapan-bit), yang berguna jika pengangkutan atau penyimpanan
tidak selamat lapan-bit. Ditakrifkan oleh RFC 2152.
bukan watak kod mata
66 titik kod diketepikan dalam Unicode sebagai "titik kod bukan aksara". Ini semua mempunyai
"Tidak ditugaskan" ("Cn") "Kategori_Umum", dan tiada aksara akan diberikan kepada mana-mana
mereka. Ia adalah 32 titik kod antara "U+FDD0" dan "U+FDEF" termasuk, dan 34
mata kod:
U+FFFE U+FFFF
U+1FFFE U+1FFFF
U+2FFFE U+2FFFF
...
U+EFFFE U+EFFFF
U+FFFFE U+FFFFF
U+10FFFE U+10FFFF
Sehingga Unicode 7.0, bukan aksara ialah "dilarang untuk digunakan dalam pertukaran terbuka bagi
Data teks Unicode", supaya kod yang memproses strim tersebut boleh menggunakan titik kod ini
sebagai pengawal yang boleh dicampur dengan data aksara, dan akan sentiasa
boleh dibezakan daripada data tersebut. (Penekanan di atas dan dalam perenggan seterusnya ditambah dalam
dokumen ini.)
Unicode 7.0 menukar perkataan supaya mereka "tidak disyorkan untuk digunakan di tempat terbuka
pertukaran data teks Unicode". Piawaian 7.0 seterusnya berkata:
"Jika bukan watak diterima dalam pertukaran terbuka, permohonan tidak diperlukan untuk
mentafsirkannya dalam apa cara sekalipun. Walau bagaimanapun, adalah amalan yang baik untuk mengiktirafnya sebagai a
bukan watak dan untuk mengambil tindakan yang sewajarnya, seperti menggantikannya dengan "U+FFFD"
aksara gantian, untuk menunjukkan masalah dalam teks. Ia tidak disyorkan untuk
hanya padamkan titik kod bukan aksara daripada teks sedemikian, kerana potensinya
isu keselamatan yang disebabkan oleh pemadaman aksara yang tidak ditafsirkan. (Lihat klausa pematuhan
C7 dalam Bahagian 3.2, Keperluan Pematuhan dan Laporan Teknikal Unikod #36,
"Pertimbangan Keselamatan Unicode"
<http://www.unicode.org/reports/tr36/#Menggantikan_Surutan_Sakit_Terbentuk>)."
Perubahan ini dibuat kerana didapati bahawa pelbagai alat komersial seperti editor, atau
untuk perkara seperti kawalan kod sumber, telah ditulis supaya ia tidak dapat dikendalikan
fail program yang menggunakan titik kod ini, dengan berkesan menghalang penggunaannya hampir
sepenuhnya! Dan itu tidak pernah menjadi niat. Mereka sentiasa dimaksudkan untuk boleh digunakan di dalam
permohonan, atau set aplikasi bekerjasama, sesuka hati.
Jika anda menulis kod, seperti editor, itu sepatutnya boleh mengendalikan sebarang
Data teks Unicode, maka anda tidak sepatutnya menggunakan mata kod ini sendiri, dan sebaliknya
benarkan mereka dalam input. Jika anda memerlukan pengawal, mereka sepatutnya menjadi sesuatu yang begitu
bukan Unicode yang sah. Untuk data UTF-8, anda boleh menggunakan bait 0xC1 dan 0xC2 sebagai pengawal, sebagai
mereka tidak pernah muncul dalam UTF-8 yang dibentuk dengan baik. (Terdapat persamaan untuk UTF-EBCDIC). Awak boleh
juga simpan mata kod Unicode anda dalam pembolehubah integer dan gunakan nilai negatif sebagai
pengawal.
Jika anda tidak menulis alat sedemikian, maka sama ada anda menerima bukan aksara sebagai input terpulang
anda (walaupun Standard mengesyorkan anda tidak). Jika anda melakukan semakan aliran input yang ketat
dengan Perl, titik kod ini terus dilarang. Ini adalah untuk mengekalkan ke belakang
keserasian (jika tidak, kemungkinan lubang keselamatan boleh terbuka, sebagai tidak curiga
aplikasi yang telah ditulis dengan mengandaikan bukan aksara akan ditapis sebelum ini
mencapainya, boleh sekarang, tanpa amaran, mula mendapatkannya). Untuk melakukan pemeriksaan yang ketat,
anda boleh menggunakan lapisan ": encoding('UTF-8')".
Perl terus memberi amaran (menggunakan kategori amaran "nonchar", yang merupakan subkategori daripada
"utf8") jika percubaan dibuat untuk mengeluarkan bukan aksara.
Melangkaui Unicode kod mata
Titik kod Unicode maksimum ialah "U+10FFFF", dan Unicode hanya mentakrifkan operasi pada kod
menunjuk melalui itu. Tetapi Perl berfungsi pada mata kod sehingga maksimum yang dibenarkan
nombor tidak ditandatangani tersedia di platform. Walau bagaimanapun, Perl tidak akan menerima ini daripada input
aliran melainkan peraturan longgar digunakan, dan akan memberi amaran (menggunakan kategori amaran
"non_unicode", yang merupakan subkategori "utf8") jika ada output.
Memandangkan peraturan Unicode tidak ditakrifkan pada titik kod ini, jika operasi yang ditakrifkan Unikod
dilakukan ke atas mereka, Perl menggunakan apa yang kami percaya sebagai peraturan yang masuk akal, sementara secara amnya memberi amaran,
menggunakan kategori "non_unicode". Contohnya, "uc("\x{11_0000}")" akan menjana a
amaran, mengembalikan parameter input sebagai hasilnya, kerana Perl mentakrifkan huruf besar bagi
setiap titik kod bukan Unicode menjadi titik kod itu sendiri. (Semua kes berubah
operasi, bukan hanya huruf besar, berfungsi dengan cara ini.)
Situasi dengan sifat Unicode yang sepadan dalam ungkapan biasa, "\p{}" dan
Konstruk "\P{}", terhadap titik kod ini tidak begitu jelas, dan bagaimana ini
dikendalikan telah berubah kerana kami telah memperoleh pengalaman.
Satu kemungkinan ialah menganggap mana-mana padanan terhadap titik kod ini sebagai tidak ditentukan. Tetapi sejak
Perl tidak mempunyai konsep padanan yang tidak ditentukan, ia menukar ini kepada gagal atau
"SALAH". Ini hampir, tetapi tidak cukup, apa yang Perl lakukan daripada v5.14 (apabila menggunakan kod ini
mata menjadi boleh dipercayai secara amnya) melalui v5.18. Perbezaannya ialah Perl melayan semua
"\p{}" sepadan sebagai gagal, tetapi semua "\P{}" sepadan sebagai berjaya.
Satu masalah dengan ini ialah ia membawa kepada keputusan yang tidak dijangka dan mengelirukan dalam sesetengahnya
kes:
b.c(0x110000) =~ \p{ASCII_Hex_Digit=True} # Gagal pada <= v5.18
b.c(0x110000) =~ \p{ASCII_Hex_Digit=False} # Gagal! pada <= v5.18
Iaitu, ia menganggap kedua-dua padanan sebagai tidak ditentukan, dan menukarnya kepada palsu (meningkatkan a
amaran pada setiap satu). Kes pertama adalah hasil yang dijangkakan, tetapi yang kedua mungkin
berlawanan dengan intuisi: "Bagaimana kedua-duanya boleh palsu sedangkan ia adalah pelengkap?" Masalah lain
adalah bahawa pelaksanaan mengoptimumkan banyak padanan sifat Unicode ke sudah
operasi sedia ada yang lebih mudah, lebih pantas, yang tidak menimbulkan amaran. Kami memilih untuk tidak melupakan
pengoptimuman tersebut, yang membantu sebahagian besar perlawanan, hanya untuk menjana amaran
untuk kejadian yang tidak mungkin bahawa titik kod Unicode di atas sedang dipadankan.
Akibat daripada masalah ini, bermula pada v5.20, perkara yang Perl lakukan ialah merawat bukan Unicode
mata kod hanya sebagai aksara Unicode biasa yang tidak ditetapkan, dan sepadan dengan sewajarnya.
(Nota: Unicode mempunyai titik kod yang tidak ditetapkan. Contohnya, ia mempunyai kod bukan aksara
mata, dan mata yang, apabila mereka ditugaskan, ditakdirkan untuk ditulis Hak-ke-
kiri, seperti bahasa Arab dan Ibrani. Perl menganggap bahawa tiada titik kod bukan Unicode mempunyai sebarang
sifat atipikal.)
Perl, dalam kebanyakan kes, akan menimbulkan amaran apabila memadankan titik kod Unicode di atas
terhadap sifat Unicode apabila hasilnya "TRUE" untuk "\p{}", dan "FALSE" untuk "\P{}".
Sebagai contoh:
b.c(0x110000) =~ \p{ASCII_Hex_Digit=True} # Gagal, tiada amaran
b.c(0x110000) =~ \p{ASCII_Hex_Digit=False} # Berjaya, dengan amaran
Dalam kedua-dua contoh ini, aksara yang dipadankan adalah bukan Unicode, jadi Unicode tidak
tentukan bagaimana ia harus dipadankan. Ia jelas bukan digit hex ASCII, jadi contoh pertama
jelas harus gagal, dan begitu juga, tanpa amaran. Tetapi boleh dikatakan bahawa yang kedua
contoh harus mempunyai hasil yang tidak ditentukan, oleh itu "PALSU". Jadi amaran dibangkitkan untuknya.
Oleh itu amaran dibangkitkan untuk banyak kes yang lebih sedikit daripada Perls terdahulu, dan hanya apabila apa
hasilnya boleh dipertikaikan. Ternyata tiada pengoptimuman yang dibuat oleh Perl
(atau mungkin akan dibuat) menyebabkan amaran dilangkau, jadi ia menyelesaikan kedua-duanya
masalah pendekatan awal Perl. Harta yang paling biasa digunakan yang terjejas oleh
perubahan ini ialah "\p{Unassigned}" yang merupakan bentuk ringkas untuk
"\p{General_Category=Unassigned}". Bermula pada v5.20, semua titik kod bukan Unikod adalah
dianggap "Tidak ditugaskan". Dalam keluaran terdahulu perlawanan gagal kerana keputusannya
dianggap tidak ditentukan.
Satu-satunya tempat di mana amaran tidak dibangkitkan apabila ia sepatutnya berlaku adalah jika
pengoptimuman menyebabkan keseluruhan padanan corak tidak dapat dicuba. Contohnya, Perl
mungkin mengetahui bahawa untuk rentetan sepadan dengan corak ungkapan biasa tertentu, rentetan
mesti mengandungi subrentetan "foobar". Sebelum mencuba perlawanan, Perl mungkin mencari
subrentetan itu, dan jika tidak dijumpai, serta-merta gagalkan perlawanan tanpa benar-benar mencubanya;
jadi tiada amaran akan dijana walaupun rentetan mengandungi titik kod Unicode di atas.
Tingkah laku ini lebih "Lakukan apa yang saya maksudkan" daripada Perls yang terdahulu untuk kebanyakan aplikasi. Tetapi
ia menangkap lebih sedikit isu untuk kod yang perlu mematuhi Unicode dengan ketat. Oleh itu
terdapat mod operasi tambahan yang tersedia untuk menampung kod tersebut. Mod ini adalah
didayakan jika corak ungkapan biasa disusun dalam skop leksikal di mana
Kelas amaran "non_unicode" telah menyebabkan kematian, katakan oleh:
gunakan amaran FATAL => "non_unicode"
(lihat amaran). Dalam mod operasi ini, Perl akan menaikkan amaran untuk semua perlawanan
terhadap titik kod bukan Unicode (bukan hanya yang boleh dipertikaikan), dan ia melangkau kod
pengoptimuman yang mungkin menyebabkan amaran tidak dikeluarkan. (Pada masa ini masih tidak akan
beri amaran jika perlawanan itu tidak dicuba, seperti dalam contoh "foobar" di atas.)
Ringkasnya, Perl kini biasanya menganggap titik kod bukan Unikod sebagai Unikod biasa yang tidak ditetapkan
mata kod untuk padanan ungkapan biasa, menaikkan amaran hanya apabila ia boleh dipertikaikan
apakah keputusan yang sepatutnya. Walau bagaimanapun, jika amaran ini telah menyebabkan kematian, ia tidak
dilangkau.
Terdapat satu pengecualian untuk semua ini. "\p{Semua}" kelihatan seperti sifat Unicode, tetapi ia adalah a
Sambungan Perl yang ditakrifkan sebagai benar untuk semua titik kod yang mungkin, Unicode atau tidak, jadi
tiada amaran pernah dihasilkan apabila memadankan ini dengan titik kod bukan Unicode. (Sebelum
kepada v5.20, ia adalah sinonim tepat untuk "\p{Any}", memadankan mata kod 0 hingga 0x10FFFF.)
Keselamatan Implikasi of Unicode
Pertama, baca Pertimbangan Keselamatan Unicodehttp://www.unicode.org/reports/tr36>.
Juga, perhatikan perkara berikut:
· UTF-8 cacat
Malangnya, spesifikasi asal UTF-8 meninggalkan sedikit ruang untuk tafsiran
berapa banyak bait output yang dikodkan harus dijana daripada satu input Unicode
watak. Tegasnya, urutan terpendek mungkin bagi UTF-8 bait sepatutnya
dijana, kerana jika tidak terdapat potensi limpahan penimbal input di
menerima hujung sambungan UTF-8. Perl sentiasa menjana panjang terpendek UTF-8,
dan dengan amaran dihidupkan, Perl akan memberi amaran tentang panjang tidak terpendek UTF-8 bersama-sama dengan yang lain
kecacatan, seperti pengganti, yang bukan mata kod Unicode yang sah
pertukaran.
· Padanan corak ungkapan biasa mungkin mengejutkan anda jika anda tidak biasa melakukannya
Unicode. Bermula dalam Perl 5.14, beberapa pengubah suai corak tersedia untuk dikawal
ini, dipanggil pengubah set aksara. Butiran diberikan dalam "Set aksara
pengubahsuai" dalam perlre.
Seperti yang dibincangkan di tempat lain, Perl mempunyai satu kaki (dua kuku?) ditanam di setiap dua dunia:
dunia lama ASCII dan tempatan bait tunggal, dan dunia baharu Unicode, menaik taraf apabila
perlu. Jika kod warisan anda tidak menggunakan Unicode secara eksplisit, tiada pertukaran automatik
kepada Unicode sepatutnya berlaku.
Unicode in Perl on EBCDIC
Unicode disokong pada platform EBCDIC. Lihat perlebcdic.
Melainkan isu ASCII lwn. EBCDIC dibincangkan secara khusus, rujukan kepada UTF-8
pengekodan dalam dokumen ini dan di tempat lain hendaklah dibaca sebagai bermaksud UTF-EBCDIC pada EBCDIC
platform. Lihat "Unicode dan UTF" dalam perlebcdic.
Oleh kerana UTF-EBCDIC sangat serupa dengan UTF-8, perbezaan kebanyakannya tersembunyi daripada anda;
"use utf8" (dan BUKAN sesuatu seperti "use utfebcdic") mengisytiharkan skrip berada dalam
pengekodan 8-bit Unicode "asli" platform. (Begitu juga untuk lapisan ":utf8".)
Tempatan
Lihat "Unicode dan UTF-8" dalam perlocale
Bila Unicode Adakah tidak Berlaku
Masih terdapat banyak tempat di mana Unicode (dalam beberapa pengekodan atau yang lain) boleh diberikan sebagai
hujah atau diterima sebagai hasil, atau kedua-duanya dalam Perl, tetapi tidak, walaupun Perl mempunyai
cara yang meluas untuk memasukkan dan mengeluarkan dalam Unicode, dan beberapa "titik masuk" lain seperti
@ARGV array (yang kadangkala boleh ditafsirkan sebagai UTF-8).
Berikut adalah antara muka sedemikian. Juga, lihat "Pepijat Unicode"". Untuk semua ini
antara muka Perl pada masa ini (setakat v5.16.0) hanya menganggap rentetan bait kedua-duanya sebagai argumen
dan keputusan, atau rentetan UTF-8 jika pragma "pengekodan" (tidak digunakan lagi) telah digunakan.
Satu sebab bahawa Perl tidak cuba menyelesaikan peranan Unicode dalam situasi ini
ialah jawapannya sangat bergantung pada sistem pengendalian dan sistem fail.
Sebagai contoh, sama ada nama fail boleh berada dalam Unicode dan dalam jenis pengekodan yang tepat
bukan konsep mudah alih. Begitu juga untuk "qx" dan "sistem": seberapa baiknya
"antara muka baris arahan" (dan yang manakah antara mereka?) mengendalikan Unicode?
· "chdir", "chmod", "chown", "chroot", "exec", "link", "lstat", "mkdir", "rename",
"rmdir", "stat", "symlink", "truncate", "nyahpaut", "utime", "-X"
· %ENV
· "glob" (aka "<*>")
· "terbuka", "opendir", "sysopen"
· "qx" (aka operator backtick), "sistem"
· "readdir", "readlink"
. "Unikod pepijat"
Istilah, "Pepijat Unicode" telah digunakan untuk ketidakselarasan dengan titik kod dalam
Blok "Latin-1 Supplement", iaitu antara 128 dan 255. Tanpa tempat yang ditentukan,
tidak seperti semua aksara atau titik kod lain, aksara ini boleh mempunyai sangat berbeza
semantik bergantung kepada peraturan yang berkuat kuasa. (Watak yang mata kodnya melebihi 255
memaksa peraturan Unicode; manakala peraturan untuk aksara ASCII adalah sama di bawah kedua-dua ASCII
dan peraturan Unicode.)
Di bawah peraturan Unicode, aksara Latin1 atas ini ditafsirkan sebagai titik kod Unicode,
yang bermaksud mereka mempunyai semantik yang sama seperti kawalan Latin-1 (ISO-8859-1) dan C1.
Seperti yang dijelaskan dalam "Peraturan ASCII berbanding Peraturan Unikod", di bawah peraturan ASCII, ia dipertimbangkan
menjadi watak yang tidak ditetapkan.
Ini boleh membawa kepada hasil yang tidak dijangka. Sebagai contoh, semantik rentetan boleh tiba-tiba
tukar jika titik kod di atas 255 dilampirkan padanya, yang mengubah peraturan daripada ASCII kepada
Unicode. Sebagai contoh, pertimbangkan program berikut dan outputnya:
$ perl -le'
tiada ciri 'unicode_strings';
$s1 = "\xC2";
$s2 = "\x{2660}";
untuk ($s1, $s2, $s1.$s2) {
cetak /\w/ || 0;
}
'
0
0
1
Jika tiada "\w" dalam "s1" mahupun dalam "s2", mengapakah penggabungan mereka mempunyai satu?
Anomali ini berpunca daripada percubaan Perl untuk tidak mengganggu program lama yang tidak digunakan
Unicode, bersama-sama dengan keinginan Perl untuk menambah sokongan Unicode dengan lancar. Tetapi hasilnya
ternyata tidak lancar. (Dengan cara ini, anda boleh memilih untuk diberi amaran apabila perkara seperti itu
ini berlaku. Lihat "pengekodan::amaran".)
"gunakan ciri 'unicode_strings'" telah ditambah, bermula dalam Perl v5.12, untuk menangani perkara ini
masalah. Ia mempengaruhi perkara ini:
· Menukar kes skalar, iaitu, menggunakan "uc()", "ucfirst()", "lc()", dan
"lcfirst()", atau "\L", "\U", "\u" dan "\l" dalam konteks dwi-quotish, seperti biasa
penggantian ungkapan.
Di bawah "unicode_strings" bermula dalam Perl 5.12.0, peraturan Unicode biasanya digunakan.
Lihat "lc" dalam perlfunc untuk mendapatkan butiran tentang cara ini berfungsi dalam kombinasi dengan pelbagai yang lain
pragmas.
· Menggunakan padanan ungkapan biasa tanpa huruf besar ("/i").
Bermula dalam Perl 5.14.0, ungkapan biasa disusun dalam skop
"unicode_strings" menggunakan peraturan Unicode walaupun apabila dilaksanakan atau disusun menjadi biasa yang lebih besar
ungkapan di luar skop.
· Memadankan mana-mana daripada beberapa sifat dalam ungkapan biasa.
Sifat ini ialah "\b" (tanpa pendakap), "\B" (tanpa pendakap), "\s", "\S", "\w",
"\W", dan semua kelas aksara Posix kecuali "[[:ascii:]]".
Bermula dalam Perl 5.14.0, ungkapan biasa disusun dalam skop
"unicode_strings" menggunakan peraturan Unicode walaupun apabila dilaksanakan atau disusun menjadi biasa yang lebih besar
ungkapan di luar skop.
· Dalam "quotemeta" atau setara sebaris "\Q".
Bermula dalam Perl 5.16.0, peraturan petikan yang konsisten digunakan dalam skop
"unicode_strings", seperti yang diterangkan dalam "quotemeta" dalam perlfunc. Sebelum itu, atau di luar
skopnya, tiada titik kod di atas 127 dipetik dalam rentetan berkod UTF-8, tetapi dalam bait
rentetan yang dikodkan, titik kod antara 128-255 sentiasa dipetik.
Anda boleh melihat daripada di atas bahawa kesan "unicode_strings" meningkat ke atas beberapa
Perl dikeluarkan. (Dan sokongan Perl untuk Unicode terus bertambah baik; sebaiknya gunakan
keluaran terkini yang tersedia untuk mendapatkan hasil yang paling lengkap dan tepat yang mungkin.)
Ambil perhatian bahawa "unicode_strings" dipilih secara automatik jika anda "menggunakan 5.012" atau lebih tinggi.
Untuk Perls lebih awal daripada yang diterangkan di atas, atau apabila rentetan dihantar ke fungsi
di luar skop "unicode_strings", lihat bahagian seterusnya.
Memaksa Unicode in Perl (Atau Tidak memaksa Unicode in Perl)
Kadangkala (lihat "Apabila Unicode Tidak Berlaku" atau "The "Unicode Bug"") terdapat situasi
di mana anda hanya perlu memaksa rentetan bait ke dalam UTF-8, atau sebaliknya. Piawaian
modul Encode boleh digunakan untuk ini, atau panggilan peringkat rendah "utf8::upgrade($bytestring)"
dan "utf8::downgrade($utf8string[, FAIL_OK])".
Ambil perhatian bahawa "utf8::downgrade()" boleh gagal jika rentetan mengandungi aksara yang tidak sesuai
ke dalam bait.
Memanggil mana-mana fungsi pada rentetan yang sudah berada dalam keadaan yang diingini adalah tiada operasi.
"Peraturan ASCII lawan Peraturan Unikod" memberikan semua cara rentetan dibuat untuk menggunakan Unikod
peraturan.
Menggunakan Unicode in XS
Lihat "Sokongan Unicode" dalam perlguts untuk pengenalan kepada Unicode pada peringkat XS, dan
"Sokongan Unicode" dalam perlapi untuk butiran API.
penggodaman Perl kepada bekerja on awal Unicode versi (Untuk sangat serius penggodam sahaja)
Perl secara lalai disertakan dengan versi Unicode terkini yang disokong terbina dalam, tetapi matlamatnya adalah
untuk membolehkan anda menukar untuk menggunakan mana-mana yang lebih awal. Dalam Perls v5.20 dan v5.22, bagaimanapun,
versi terawal yang boleh digunakan ialah Unicode 5.1. Perl v5.18 mampu mengendalikan semua lebih awal
versi.
Muat turun fail dalam versi Unicode yang dikehendaki dari tapak web Unicode
<http://www.unicode.org>). Ini harus menggantikan fail sedia ada dalam lib/unicore dalam
Pokok sumber Perl. Ikut arahan dalam README.perl dalam direktori itu untuk menukar beberapa
nama mereka, dan kemudian bina perl (lihat PASANG).
Pelabuhan kod dari perl-5.6.X
Perls bermula pada 5.8 mempunyai model Unicode yang berbeza daripada 5.6. Dalam 5.6 pengaturcara adalah
dikehendaki menggunakan pragma "utf8" untuk mengisytiharkan bahawa skop tertentu dijangka akan ditangani
Data Unicode dan perlu memastikan bahawa hanya data Unicode yang mencapai skop tersebut. Jika awak
mempunyai kod yang berfungsi dengan 5.6, anda memerlukan beberapa pelarasan berikut untuk
kod anda. Contoh-contoh ditulis sedemikian rupa sehingga kod akan terus berfungsi di bawah 5.6, jadi
anda sepatutnya selamat mencubanya.
· Pemegang fail yang sepatutnya membaca atau menulis UTF-8
jika ($] > 5.008) {
binmode $fh, ": pengekodan(utf8)";
}
· Skalar yang akan dihantar ke beberapa sambungan
Sama ada "Compress::Zlib", "Apache::Request" atau sebarang sambungan yang tidak disebut
Unicode dalam halaman manual, anda perlu memastikan bahawa bendera UTF8 dilucutkan. Nota
bahawa pada masa penulisan ini (Januari 2012) modul yang disebutkan tidak
UTF-8-sedar. Sila semak dokumentasi untuk mengesahkan sama ada ini masih benar.
jika ($] > 5.008) {
memerlukan Pengekodan;
$val = Encode::encode_utf8($val); # buat oktet
}
· Skalar yang kami dapat semula daripada sambungan
Jika anda percaya skalar kembali sebagai UTF-8, kemungkinan besar anda mahukan bendera UTF8
dipulihkan:
jika ($] > 5.008) {
memerlukan Pengekodan;
$val = Encode::decode_utf8($val);
}
· Perkara yang sama, jika anda benar-benar pasti ia adalah UTF-8
jika ($] > 5.008) {
memerlukan Pengekodan;
Encode::_utf8_on($val);
}
· Pembalut untuk "fetchrow_array" dan "fetchrow_hashref" DBI
Apabila pangkalan data hanya mengandungi UTF-8, fungsi atau kaedah pembungkus adalah cara yang mudah
untuk menggantikan semua panggilan "fetchrow_array" dan "fetchrow_hashref" anda. Fungsi pembalut
juga akan memudahkan untuk menyesuaikan diri dengan peningkatan masa hadapan dalam pemacu pangkalan data anda. Nota
bahawa pada masa penulisan ini (Januari 2012), DBI tidak mempunyai cara piawai untuk
berurusan dengan data UTF-8. Sila semak dokumentasi DBI untuk mengesahkan sama ada itu masih
benar.
sub fetchrow {
# $apa itu fetchrow_{array,hashref}
my($self, $sth, $what) = @_;
jika ($] < 5.008) {
kembalikan $sth->$apa;
} Lain {
memerlukan Pengekodan;
jika (wantarray) {
my @arr = $sth->$apa;
untuk (@arr) {
ditakrifkan && /[^\000-\177]/ && Encode::_utf8_on($_);
}
kembali @arr;
} Lain {
$ret saya = $sth->$apa;
jika (rujuk $ret) {
untuk $k saya (kunci %$ret) {
ditakrifkan
&& /[^\000-\177]/
&& Encode::_utf8_on($_) untuk $ret->{$k};
}
pulangkan $ret;
} Lain {
ditakrifkan && /[^\000-\177]/ && Encode::_utf8_on($_) untuk $ret;
pulangkan $ret;
}
}
}
}
· Skalar besar yang anda tahu hanya boleh mengandungi ASCII
Skalar yang mengandungi hanya ASCII dan ditandakan sebagai UTF-8 kadangkala menjadi seretan kepada anda
program. Jika anda mengenali situasi sedemikian, cuma keluarkan bendera UTF8:
utf8::turun taraf($val) jika $] > 5.008;
Gunakan perlunicode dalam talian menggunakan perkhidmatan onworks.net