Ini adalah perintah perlllocale yang dapat dijalankan di penyedia hosting gratis OnWorks menggunakan salah satu dari beberapa workstation online gratis kami seperti Ubuntu Online, Fedora Online, emulator online Windows atau emulator online MAC OS
PROGRAM:
NAMA
perllocale - Penanganan lokal Perl (internasionalisasi dan lokalisasi)
DESKRIPSI
Pada awalnya ada ASCII, "Kode Standar Amerika untuk Informasi"
Interchange", yang bekerja cukup baik untuk orang Amerika dengan alfabet bahasa Inggris dan dolar-
mata uang denominasi. Tapi itu tidak bekerja dengan baik bahkan untuk penutur bahasa Inggris lainnya, yang
dapat menggunakan mata uang yang berbeda, seperti pound sterling (sebagai simbol untuk mata uang itu
tidak ada di ASCII); dan itu sangat tidak memadai untuk ribuan orang di dunia
bahasa lainnya.
Untuk mengatasi kekurangan ini, konsep lokal diciptakan (secara resmi ISO C,
XPG4, POSIX 1.c "sistem lokal"). Dan aplikasi pernah dan sedang ditulis yang menggunakan
mekanisme lokal. Proses pembuatan aplikasi semacam itu mempertimbangkan
preferensi pengguna dalam hal-hal semacam ini disebut penginternasionalan (sering
disingkat sebagai I18n); memberi tahu aplikasi semacam itu tentang serangkaian preferensi tertentu adalah
dikenal sebagai lokalisasi (L10n).
Perl telah diperluas untuk mendukung sistem lokal. Ini dikontrol per aplikasi
dengan menggunakan satu pragma, satu panggilan fungsi, dan beberapa variabel lingkungan.
Sayangnya, ada beberapa kekurangan dengan desain (dan seringkali,
implementasi) lokal. Unicode ditemukan (lihat perlunitut untuk pengenalan tentang
itu) sebagian untuk mengatasi kekurangan desain ini, dan saat ini, ada serangkaian
"Lokal UTF-8", berdasarkan Unicode. Ini adalah lokal yang set karakternya adalah Unicode,
dikodekan dalam UTF-8. Mulai v5.20, Perl sepenuhnya mendukung lokal UTF-8, kecuali untuk
pengurutan dan perbandingan string. (Gunakan Unicode::Collate untuk ini.) Perl terus
mendukung lokal non UTF-8 lama juga. Saat ini tidak ada lokal UTF-8 untuk
platform EBCDIC.
(Unicode juga membuat "CLDR", "Repositori Data Lokal Umum",
<http://cldr.unicode.org/> yang mencakup lebih banyak jenis informasi daripada yang tersedia di
sistem lokal POSIX. Pada saat penulisan ini, tidak ada modul CPAN yang
menyediakan akses ke data yang disandikan XML ini. Namun, banyak dari lokalnya memiliki POSIX-
hanya data yang diekstraksi, dan tersedia sebagai lokal UTF-8 di
<http://unicode.org/Public/cldr/latest/>.)
APA IS A LOKAL
Lokal adalah kumpulan data yang menggambarkan berbagai aspek tentang bagaimana berbagai komunitas di
dunia mengkategorikan dunia mereka. Kategori-kategori ini dipecah menjadi jenis berikut:
(beberapa di antaranya termasuk catatan singkat di sini):
Kategori "LC_NUMERIC": Pemformatan numerik
Ini menunjukkan bagaimana angka harus diformat untuk keterbacaan manusia, misalnya
karakter yang digunakan sebagai titik desimal.
Kategori "LC_MONETARY": Pemformatan jumlah moneter
Kategori "LC_TIME": Pemformatan Tanggal/Waktu
Kategori "LC_MESSAGES": Kesalahan dan pesan lainnya
Ini digunakan oleh Perl sendiri hanya untuk mengakses pesan kesalahan sistem operasi melalui $!
dan $^E.
Kategori "LC_COLLATE": Pengumpulan
Ini menunjukkan urutan huruf untuk perbandingan dan penyortiran. dalam bahasa latin
alfabet, misalnya, "b", umumnya mengikuti "a".
Kategori "LC_CTYPE": Tipe Karakter
Ini menunjukkan, misalnya jika karakter adalah huruf besar.
Kategori lainnya
Beberapa platform memiliki kategori lain, berurusan dengan hal-hal seperti unit pengukuran
dan ukuran kertas. Tak satu pun dari ini digunakan secara langsung oleh Perl, tetapi operasi luar yang
Perl berinteraksi dengan dapat menggunakan ini. Lihat "Tidak dalam cakupan "gunakan lokal"" di bawah.
Rincian lebih lanjut tentang kategori yang digunakan oleh Perl diberikan di bawah ini di "KATEGORI LOKAL".
Bersama-sama, kategori ini sangat membantu untuk menyesuaikan satu program
untuk berjalan di banyak lokasi yang berbeda. Tapi ada kekurangan, jadi teruslah membaca.
MEMPERSIAPKAN UNTUK GUNAKAN LOKAL
Perl sendiri (di luar modul POSIX) tidak akan menggunakan lokal kecuali jika diminta secara khusus
to (tetapi sekali lagi perhatikan bahwa Perl dapat berinteraksi dengan kode yang menggunakannya). Bahkan jika ada
permintaan seperti itu, semua berikut ini harus benar agar dapat berfungsi dengan baik:
· Anda operasi sistem harus mendukung itu Lokal sistem. Jika ya, Anda harus menemukan
bahwa fungsi "setlocale()" adalah bagian terdokumentasi dari pustaka C-nya.
· Definisi untuk lokal bahwa Anda menggunakan harus be diinstal. Anda, atau sistem Anda
administrator, harus memastikan bahwa ini masalahnya. Lokal yang tersedia,
lokasi di mana mereka disimpan, dan cara pemasangannya semuanya berbeda-beda
dari sistem ke sistem. Beberapa sistem hanya menyediakan beberapa lokal terprogram dan tidak
memungkinkan lebih untuk ditambahkan. Lainnya memungkinkan Anda untuk menambahkan lokal "kalengan" yang disediakan oleh
pemasok sistem. Yang lain lagi mengizinkan Anda atau administrator sistem untuk menentukan dan menambahkan
lokal yang sewenang-wenang. (Anda mungkin harus meminta pemasok Anda untuk menyediakan lokal kalengan yang
tidak dikirimkan bersama sistem operasi Anda.) Baca dokumentasi sistem Anda untuk
penerangan lebih lanjut.
· Perl harus Percaya bahwa itu Lokal sistem is didukung. Jika ya, "perl
-V:d_setlocale" akan mengatakan bahwa nilai untuk "d_setlocale" adalah "define".
Jika Anda ingin aplikasi Perl memproses dan menyajikan data Anda sesuai dengan tertentu
lokal, kode aplikasi harus menyertakan pragma "gunakan lokal" (lihat "penggunaan lokal"
pragma") jika sesuai, dan at paling sedikit satu berikut ini harus benar:
1. penentuan lokal lingkungan Hidup variabel (Lihat "LINGKUNGAN") harus be benar set
up pada saat aplikasi dimulai, baik oleh Anda sendiri atau oleh siapa pun yang mengatur
akun sistem Anda; atau
2. aplikasi harus set -nya sendiri Lokal menggunakan metode yang dijelaskan dalam "The setlocale
fungsi".
MENGGUNAKAN LOKAL
"menggunakan lokal" pragma
Secara default, Perl itu sendiri (di luar modul POSIX) mengabaikan lokal saat ini. Itu
Pragma "gunakan lokal" memberitahu Perl untuk menggunakan lokal saat ini untuk beberapa operasi. Mulai di
v5.16, ada parameter opsional untuk pragma ini, yang dijelaskan di bawah, yang membatasi mana
operasi dipengaruhi olehnya.
Lokal saat ini diatur pada waktu eksekusi oleh setlokal() dijelaskan di bawah ini. Jika itu
fungsi belum dipanggil selama eksekusi program, saat ini
lokal adalah apa yang ditentukan oleh "LINGKUNGAN" yang berlaku pada awal
program. Jika tidak ada lingkungan yang valid, lokal saat ini adalah apa pun sistemnya
default telah diatur ke. Pada sistem POSIX, kemungkinan besar, tetapi tidak harus, "C"
lokal. Pada Windows, default diatur melalui komputer
"Control Panel->Regional and Language Options" (atau yang setara saat ini).
Operasi yang dipengaruhi oleh lokal adalah:
Tidak dalam itu cakupan of "menggunakan lokal"
Hanya operasi tertentu yang berasal dari luar Perl yang akan terpengaruh, sebagai berikut:
· Lokal saat ini digunakan saat keluar dari Perl dengan operasi seperti
sistem() atau qx//, jika operasi tersebut peka terhadap lokal.
· Perl juga memberikan akses ke berbagai fungsi pustaka C melalui modul POSIX.
Beberapa dari fungsi tersebut selalu dipengaruhi oleh lokal saat ini. Sebagai contoh,
"POSIX::strftime()" menggunakan "LC_TIME"; "POSIX::strtod()" menggunakan "LC_NUMERIC";
"POSIX::strcoll()" dan "POSIX::strxfrm()" gunakan "LC_COLLATE"; dan karakter
fungsi klasifikasi seperti "POSIX::isalnum()" menggunakan "LC_CTYPE". Semua seperti itu
fungsi akan berperilaku sesuai dengan lokal yang mendasari saat ini, bahkan jika itu
lokal tidak terkena ruang Perl.
· Modul XS untuk semua kategori tetapi "LC_NUMERIC" mendapatkan lokal yang mendasarinya, dan
karenanya setiap fungsi pustaka C yang mereka panggil akan menggunakan lokal yang mendasarinya. Untuk lebih
diskusi, lihat "PERINGATAN" di perlxs.
Perhatikan bahwa semua program C (termasuk juru bahasa Perl, yang ditulis dalam C)
selalu memiliki lokal yang mendasarinya. Lokal itu adalah lokal "C" kecuali diubah oleh a
panggilan ke setlokal(). Ketika Perl dimulai, itu mengubah lokal yang mendasarinya menjadi yang
yang ditandai dengan "LINGKUNGAN". Saat menggunakan modul POSIX atau menulis XS
kode, penting untuk diingat bahwa lokal yang mendasarinya mungkin sesuatu
selain "C", meskipun program tidak secara eksplisit mengubahnya.
Berlama-lama efek of "menggunakan lokal"
Operasi Perl tertentu yang diatur dalam lingkup "gunakan lokal" mempertahankan itu
efek bahkan di luar ruang lingkup. Ini termasuk:
· Format keluaran dari a menulis() ditentukan oleh deklarasi format sebelumnya
("format" dalam perlfunc), jadi apakah output dipengaruhi oleh lokal atau tidak adalah
ditentukan oleh apakah "format ()" berada dalam lingkup "gunakan lokal", bukan apakah
"tulis ()" adalah.
· Pola ekspresi reguler dapat dikompilasi menggunakan qr// dengan pencocokan aktual
ditangguhkan nanti. Sekali lagi, apakah kompilasi dilakukan di dalam atau tidak
cakupan "gunakan lokal" yang menentukan perilaku kecocokan, bukan kecocokan
dilakukan dalam lingkup seperti itu atau tidak.
Bawah ""menggunakan lokal";"
· Semua operasi di atas
· dibentuk deklarasi ("format" dalam perlfunc) dan karenanya setiap penggunaan "tulis()" berikutnya
"LC_NUMERIC".
· stringifikasi dan keluaran gunakan "LC_NUMERIC". Ini termasuk hasil dari
"print()", "printf()", "say()", dan "sprintf()".
· perbandingan operator ("lt", "le", "cmp", "ge", dan "gt") gunakan "LC_COLLATE".
"sort()" juga terpengaruh jika digunakan tanpa fungsi perbandingan eksplisit, karena
ia menggunakan "cmp" secara default.
Catatan: "eq" dan "ne" tidak terpengaruh oleh lokal: mereka selalu melakukan char-by-char
perbandingan operan skalar mereka. Terlebih lagi, jika "cmp" menemukan itu
operan sama sesuai dengan urutan susunan yang ditentukan oleh arus
lokal, ia melanjutkan untuk melakukan perbandingan char-by-char, dan hanya kembali 0
(sama) jika operan char-for-char identik. Jika Anda benar-benar ingin tahu
apakah dua string--yang "eq" dan "cmp" dapat dianggap berbeda--sama sejauh
sebagai susunan di lokal yang bersangkutan, lihat diskusi di "Kategori
"LC_COLLATE": Pengumpulan".
· Reguler ekspresi dan modifikasi kasus fungsi ("uc()", "lc()", "ucfirst()",
dan "lcfirst()") menggunakan "LC_CTYPE"
· variabel $! (dan sinonimnya $ERRNO dan $OS_ERROR) dan $^E (dan sinonimnya
$EXTENDED_OS_ERROR) saat digunakan sebagai string gunakan "LC_MESSAGES".
Perilaku default dipulihkan dengan pragma "tidak ada lokal", atau setelah mencapai akhir
blok yang melampirkan "gunakan lokal". Perhatikan bahwa panggilan "gunakan lokal" mungkin bersarang, dan itu
apa yang berlaku dalam lingkup dalam akan kembali ke aturan lingkup luar di akhir
dari lingkup batin.
Hasil string dari operasi apa pun yang menggunakan informasi lokal tercemar, sebagaimana adanya
mungkin untuk lokal menjadi tidak dapat dipercaya. Lihat "Keamanan".
Mulai di Perl v5.16 dengan cara yang sangat terbatas, dan lebih umum lagi di v5.22, Anda dapat
batasi kategori atau kategori mana yang diaktifkan oleh instance khusus ini
pragma dengan menambahkan parameter ke dalamnya. Sebagai contoh,
gunakan lokal qw(:ctype :numeric);
memungkinkan kesadaran lokal dalam cakupannya hanya operasi tersebut (tercantum di atas) yang
dipengaruhi oleh "LC_CTYPE" dan "LC_NUMERIC".
Kategori yang mungkin adalah: ":collate", ":ctype", ":messages", ":monetary", ":numeric",
":waktu", dan kategori semu ":karakter" (dijelaskan di bawah).
Dengan demikian Anda dapat mengatakan
gunakan lokal ':pesan';
dan hanya $! dan $^E akan sadar lokal. Segala sesuatu yang lain tidak terpengaruh.
Karena Perl saat ini tidak melakukan apa pun dengan kategori "LC_MONETARY", menentukan
":moneter" tidak melakukan apa pun secara efektif. Beberapa sistem memiliki kategori lain, seperti
"LC_PAPER_SIZE", tetapi Perl juga tidak tahu apa-apa tentang mereka, dan tidak ada cara untuk
tentukan mereka dalam argumen pragma ini.
Anda juga dapat dengan mudah mengatakan untuk menggunakan semua kategori kecuali satu, dengan salah satu, misalnya,
gunakan lokal ':!ctype';
gunakan lokal ':not_ctype';
keduanya berarti mengaktifkan kesadaran lokal dari semua kategori kecuali "LC_CTYPE". Hanya satu
argumen kategori dapat ditentukan dalam "gunakan lokal" jika dalam bentuk yang dinegasikan.
Sebelum v5.22 hanya tersedia satu bentuk pragma dengan argumen:
gunakan lokal ':not_characters';
(dan Anda harus mengatakan "not_"; Anda tidak dapat menggunakan bentuk bang "!"). Kategori semu ini adalah
singkatan untuk menentukan ":collate" dan ":ctype". Oleh karena itu, dalam bentuk yang dinegasikan, adalah
hampir sama dengan mengatakan
gunakan lokal qw(:pesan :moneter :numerik :waktu);
Kami menggunakan istilah "hampir", karena ":not_characters" juga menyala
"gunakan fitur 'unicode_strings'" dalam cakupannya. Formulir ini kurang berguna di v5.20 dan
kemudian, dan dijelaskan sepenuhnya dalam "Unicode dan UTF-8", tetapi secara singkat, ini memberitahu Perl untuk tidak
gunakan bagian karakter dari definisi lokal, yaitu "LC_CTYPE" dan
kategori "LC_COLLATE". Sebaliknya itu akan menggunakan set karakter asli (diperpanjang oleh
Unikode). Saat menggunakan parameter ini, Anda bertanggung jawab untuk mendapatkan eksternal
set karakter diterjemahkan ke dalam yang asli/Unicode (yang sudah akan terjadi jika
salah satu lokal UTF-8 yang semakin populer). Ada cara mudah untuk melakukan ini,
seperti yang dijelaskan dalam "Unicode dan UTF-8".
setlokal fungsi
Anda dapat mengganti lokal sesering yang Anda inginkan saat run time dengan "POSIX::setlocale()"
fungsi:
# Impor set alat penanganan lokal dari modul POSIX.
# Contoh ini menggunakan: setlocale -- pemanggilan fungsi
# LC_CTYPE -- dijelaskan di bawah
# (Menampilkan pengujian untuk keberhasilan/kegagalan operasi adalah
# dihilangkan dalam contoh-contoh ini untuk menghindari gangguan dari yang utama
# poin)
gunakan POSIX qw(locale_h);
gunakan lokal;
$old_locale saya;
# kueri dan simpan lokal lama
$old_locale = setlokal(LC_CTYPE);
setlocale(LC_CTYPE, "fr_CA.ISO8859-1");
# LC_CTYPE sekarang di lokal "Prancis, Kanada, codeset ISO 8859-1"
setlocale(LC_CTYPE, "");
# LC_CTYPE sekarang disetel ulang ke default yang ditentukan oleh
# Variabel lingkungan LC_ALL/LC_CTYPE/LANG, atau ke sistem
# bawaan. Lihat di bawah untuk dokumentasi.
# pulihkan lokal lama
setlokal(LC_CTYPE, $lokal_lama);
Ini secara bersamaan mempengaruhi semua utas program, jadi mungkin bermasalah untuk digunakan
lokal dalam aplikasi berulir kecuali jika ada satu lokal yang berlaku untuk semua
utas.
Argumen pertama dari "setlocale()" memberikan kategori, yang kedua Lokal. itu
kategori memberi tahu dalam aspek pemrosesan data apa Anda ingin menerapkan aturan khusus lokal.
Nama kategori dibahas dalam "KATEGORI LOKAL" dan "LINGKUNGAN". Lokal adalah
nama kumpulan informasi penyesuaian yang sesuai dengan tertentu
kombinasi bahasa, negara atau teritori, dan codeset. Baca terus untuk petunjuk tentang
penamaan lokal: tidak semua sistem memberi nama lokal seperti pada contoh.
Jika tidak ada argumen kedua yang diberikan dan kategorinya adalah sesuatu selain "LC_ALL", the
fungsi mengembalikan string yang menamai lokal saat ini untuk kategori. Anda dapat menggunakan ini
nilai sebagai argumen kedua dalam panggilan berikutnya ke "setlocale()", tapi pada beberapa platform
string itu buram, bukan sesuatu yang kebanyakan orang dapat menguraikan seperti apa
lokal maksudnya.
Jika tidak ada argumen kedua yang diberikan dan kategorinya adalah "LC_ALL", hasilnya adalah
tergantung pada implementasi. Ini mungkin string nama lokal gabungan (pemisah juga
tergantung implementasi) atau satu nama lokal. Silakan berkonsultasi dengan Anda setlokal(3) pria
halaman untuk rincian.
Jika argumen kedua diberikan dan itu sesuai dengan lokal yang valid, lokal untuk
kategori diatur ke nilai itu, dan fungsi mengembalikan nilai lokal sekarang-saat ini. Anda
kemudian dapat menggunakan ini dalam panggilan lain ke "setlocale()". (Dalam beberapa implementasi,
nilai pengembalian terkadang berbeda dari nilai yang Anda berikan sebagai argumen kedua - pikirkan
itu sebagai alias untuk nilai yang Anda berikan.)
Seperti yang ditunjukkan oleh contoh, jika argumen kedua adalah string kosong, lokal kategorinya adalah
dikembalikan ke default yang ditentukan oleh variabel lingkungan yang sesuai. Umumnya,
ini menghasilkan pengembalian ke default yang berlaku saat Perl dimulai: berubah menjadi
lingkungan yang dibuat oleh aplikasi setelah startup mungkin diperhatikan atau tidak, tergantung
di perpustakaan C sistem Anda.
Perhatikan bahwa ketika bentuk "gunakan lokal" yang tidak menyertakan semua kategori ditentukan,
Perl mengabaikan kategori yang dikecualikan.
Jika "set_locale()" gagal karena beberapa alasan (misalnya, upaya untuk menyetel ke lokal
tidak diketahui oleh sistem), lokasi untuk kategori tidak diubah, dan fungsi
mengembalikan "undef".
Untuk informasi lebih lanjut tentang kategori, konsultasikan setlokal(3).
Temuan lokal
Untuk lokal yang tersedia di sistem Anda, konsultasikan juga setlokal(3) untuk melihat apakah itu mengarah ke
daftar lokal yang tersedia (cari SEE JUGA bagian). Jika gagal, coba
baris perintah berikut:
lokal -a
nlsinfo
ls /usr/lib/nls/loc
ls /usr/lib/locale
ls /usr/lib/nls
ls /usr/bagikan/lokal
dan lihat apakah mereka mencantumkan sesuatu yang mirip dengan ini
en_US.ISO8859-1 de_DE.ISO8859-1 ru_RU.ISO8859-5
en_US.iso88591 de_DE.iso88591 ru_RU.iso88595
en_US de_DE ru_RU
dan itu ru
bahasa inggris jerman rusia
inggris.iso88591 jerman.iso88591 russian.iso88595
inggris.roman8 russian.koi8r
Sayangnya, meskipun antarmuka panggilan untuk "setlocale()" telah distandarisasi, nama-nama dari
lokal dan direktori tempat konfigurasi berada belum. Bentuk dasar
namanya adalah bahasa_wilayah.kumpulan kode, tetapi bagian terakhir setelah bahasa tidak
selalu hadir. Itu bahasa dan negara biasanya dari standar ISO 3166 dan ISO
639, singkatan dua huruf untuk negara dan bahasa di dunia,
masing-masing. Itu kumpulan kode bagian sering menyebutkan beberapa ISO 8859 set karakter, bahasa Latin
kumpulan kode. Misalnya, "ISO 8859-1" adalah apa yang disebut "kodeset Eropa Barat" yang dapat
digunakan untuk mengkodekan sebagian besar bahasa Eropa Barat secara memadai. Sekali lagi, ada beberapa
cara untuk menulis bahkan nama standar yang satu itu. Sayangnya.
Dua lokal khusus patut disebutkan secara khusus: "C" dan "POSIX". Saat ini adalah
secara efektif lokal yang sama: perbedaannya terutama bahwa yang pertama didefinisikan oleh
C standar, yang kedua dengan standar POSIX. Mereka mendefinisikan kegagalan Lokal di mana
setiap program dimulai tanpa adanya informasi lokal di lingkungannya. (Itu
kegagalan lokal default, jika Anda mau.) Bahasanya adalah (Amerika) Inggris dan
set kode karakter ASCII atau, jarang, superset daripadanya (seperti "DEC Multinational
Set Karakter (DEC-MCS)"). peringatan. Lokal C yang dikirimkan oleh beberapa vendor mungkin tidak
sebenarnya sama persis dengan apa yang diminta oleh standar C. Jadi berhati-hatilah.
CATATAN: Tidak semua sistem memiliki lokal "POSIX" (tidak semua sistem sesuai dengan POSIX), jadi
gunakan "C" ketika Anda perlu secara eksplisit menentukan lokal default ini.
LOKAL MASALAH
Anda mungkin menemukan pesan peringatan berikut saat memulai Perl:
perl: peringatan: Pengaturan lokal gagal.
perl: warning: Harap periksa apakah pengaturan lokal Anda:
LC_ALL = "En_US",
LANG = (tidak disetel)
didukung dan diinstal pada sistem Anda.
perl: warning: Kembali ke lokal standar ("C").
Ini berarti bahwa pengaturan lokal Anda telah "LC_ALL" disetel ke "En_US" dan LANG ada tetapi memiliki
Tidak bernilai. Perl mencoba memercayai Anda tetapi tidak bisa. Sebaliknya, Perl menyerah dan jatuh kembali
ke lokal "C", lokal default yang seharusnya berfungsi apa pun yang terjadi. (Pada
Windows, pertama kali mencoba kembali ke lokal default sistem.) Ini biasanya berarti
pengaturan lokal Anda salah, mereka menyebutkan lokal yang belum pernah didengar sistem Anda, atau
instalasi lokal di sistem Anda bermasalah (misalnya, beberapa file sistem adalah
rusak atau hilang). Ada perbaikan cepat dan sementara untuk masalah ini, serta
perbaikan yang lebih menyeluruh dan tahan lama.
pengujian untuk rusak lokal
Jika Anda membuat Perl dari sumber, file suite uji Perl lib/lokal.t dapat digunakan untuk
uji lokal di sistem Anda. Mengatur variabel lingkungan "PERL_DEBUG_FULL_TEST"
ke 1 akan menyebabkannya menampilkan hasil terperinci. Misalnya, di Linux, Anda bisa mengatakan
PERL_DEBUG_FULL_TEST=1 ./perl -T -Ilib lib/locale.t > locale.log 2>&1
Selain banyak tes lain, itu akan menguji setiap lokal yang ditemukan di sistem Anda untuk melihat apakah mereka
sesuai dengan standar POSIX. Jika ada kesalahan, itu akan menyertakan ringkasan di dekat akhir
dari output lokal mana yang lulus semua pengujiannya, dan mana yang gagal, dan mengapa.
Untuk sementara pemasangan Lokal masalah
Dua perbaikan tercepat adalah membuat Perl diam tentang inkonsistensi lokal apa pun
atau untuk menjalankan Perl di bawah lokal default "C".
Keluhan Perl tentang masalah lokal dapat dibungkam dengan mengatur variabel lingkungan
"PERL_BADLANG" menjadi "0" atau "". Metode ini benar-benar hanya menyapu masalah di bawah karpet:
Anda memberitahu Perl untuk tutup mulut bahkan ketika Perl melihat ada sesuatu yang salah. Jangan kaget
jika nanti sesuatu yang bergantung pada lokal berperilaku tidak semestinya.
Perl dapat dijalankan di bawah lokal "C" dengan mengatur variabel lingkungan "LC_ALL" ke "C".
Metode ini mungkin sedikit lebih beradab daripada pendekatan "PERL_BADLANG", tetapi pengaturan
"LC_ALL" (atau variabel lokal lainnya) dapat mempengaruhi program lain juga, bukan hanya Perl. Di
khususnya, program eksternal yang dijalankan dari dalam Perl akan melihat perubahan ini. Jika Anda membuat
pengaturan baru permanen (baca terus), semua program yang Anda jalankan melihat perubahannya. Melihat
"LINGKUNGAN" untuk daftar lengkap variabel lingkungan yang relevan dan "PENGGUNAAN LOKAL" untuk
efek mereka di Perl. Efek dalam program lain mudah dikurangkan. Misalnya,
variabel "LC_COLLATE" mungkin memengaruhi jenis program (atau program apa pun yang
mengatur "catatan" menurut abjad di sistem Anda disebut).
Anda dapat menguji mengubah variabel-variabel ini untuk sementara, dan jika pengaturan baru tampaknya
bantuan, masukkan pengaturan itu ke file startup shell Anda. Konsultasikan dokumentasi lokal Anda
untuk rincian yang tepat. Untuk cangkang mirip Bourne (sh, ksh, menampar, zsh):
LC_ALL=id_US.ISO8859-1
ekspor LC_ALL
Ini mengasumsikan bahwa kita melihat lokal "en_US.ISO8859-1" menggunakan perintah yang dibahas di atas.
Kami memutuskan untuk mencobanya alih-alih lokal yang salah di atas "En_US"--dan dalam cangkang Cshish
(csh, tcsh)
setenv LC_ALL en_US.ISO8859-1
atau jika Anda memiliki aplikasi "env" yang dapat Anda lakukan (di shell apa pun)
env LC_ALL=en_US.ISO8859-1 perl ...
Jika Anda tidak tahu shell apa yang Anda miliki, konsultasikan dengan helpdesk lokal Anda atau yang setara.
Secara permanen pemasangan Lokal masalah
Perbaikan yang lebih lambat tetapi lebih unggul adalah ketika Anda mungkin dapat memperbaiki sendiri
kesalahan konfigurasi variabel lingkungan Anda sendiri. Konfigurasi yang salah (bernyanyi) dari
lokal seluruh sistem biasanya memerlukan bantuan administrator sistem ramah Anda.
Pertama, lihat sebelumnya di dokumen ini tentang "Menemukan lokal". Itu memberitahu bagaimana menemukan yang
lokal sangat didukung--dan yang lebih penting, diinstal--di sistem Anda. di kami
contoh pesan kesalahan, variabel lingkungan yang memengaruhi lokal tercantum dalam urutan
semakin berkurang kepentingannya (dan variabel yang tidak disetel tidak menjadi masalah). Oleh karena itu, memiliki LC_ALL
diatur ke "En_US" pasti pilihan yang buruk, seperti yang ditunjukkan oleh pesan kesalahan. Percobaan pertama
memperbaiki pengaturan lokal terdaftar pertama.
Kedua, jika menggunakan perintah yang terdaftar Anda melihat sesuatu persis (pencocokan awalan tidak
count dan case biasanya dihitung) seperti "En_US" tanpa tanda kutip, maka Anda seharusnya baik-baik saja
karena Anda menggunakan nama lokal yang harus diinstal dan tersedia di sistem Anda.
Dalam hal ini, lihat "Memperbaiki konfigurasi lokal sistem Anda secara permanen".
Secara permanen pemasangan Tujuan sistem Lokal konfigurasi
Ini adalah ketika Anda melihat sesuatu seperti:
perl: warning: Harap periksa apakah pengaturan lokal Anda:
LC_ALL = "En_US",
LANG = (tidak disetel)
didukung dan diinstal pada sistem Anda.
tetapi kemudian tidak dapat melihat bahwa "En_US" terdaftar oleh perintah yang disebutkan di atas. Anda mungkin melihat
hal-hal seperti "en_US.ISO8859-1", tapi itu tidak sama. Dalam hal ini, coba jalankan di bawah a
lokal yang dapat Anda daftarkan dan yang entah bagaimana cocok dengan apa yang Anda coba. Aturan untuk mencocokkan
nama lokal agak kabur karena standardisasi lemah di area ini. Lihat lagi
"Menemukan lokal" tentang aturan umum.
Pemasangan sistem Lokal konfigurasi
Hubungi administrator sistem (sebaiknya Anda sendiri) dan laporkan pesan kesalahan yang tepat
Anda dapatkan, dan minta mereka untuk membaca dokumentasi yang sama yang sedang Anda baca ini. Mereka seharusnya
dapat memeriksa apakah ada yang salah dengan konfigurasi lokal dari
sistem. Sayangnya, bagian "Menemukan lokal" agak kabur tentang tepatnya
perintah dan tempat karena hal-hal ini tidak standar.
lokalkonv fungsi
Fungsi "POSIX::localeconv()" memungkinkan Anda untuk mendapatkan rincian yang bergantung pada lokal
informasi pemformatan numerik yang ditentukan oleh "LC_NUMERIC" yang mendasari saat ini dan
Lokal "LC_MONETARY" (terlepas dari apakah dipanggil dari dalam lingkup "gunakan lokal"
atau tidak). (Jika Anda hanya ingin nama lokal saat ini untuk kategori tertentu, gunakan
"POSIX::setlocale()" dengan satu parameter--lihat "Fungsi setlocale".)
gunakan POSIX qw(locale_h);
# Dapatkan referensi ke hash info yang bergantung pada lokal
$locale_values = localeconv();
# Keluarkan daftar nilai yang diurutkan
for (mengurutkan kunci %$locale_values) {
printf "%-20s = %s\n", $_, $locale_values->{$_}
}
"localeconv()" tidak mengambil argumen, dan mengembalikan a referensi untuk sebuah hash. Kunci ini
hash adalah nama variabel untuk pemformatan, seperti "titik_desimal" dan "ribuan_sep". Itu
nilai-nilai yang sesuai, er, nilai-nilai. Lihat "localeconv" di POSIX untuk contoh yang lebih panjang
membuat daftar kategori yang mungkin diharapkan diberikan oleh implementasi; beberapa menyediakan lebih banyak
dan lainnya lebih sedikit. Anda tidak memerlukan "gunakan lokal" yang eksplisit, karena "localeconv()" selalu
mengamati lokal saat ini.
Berikut adalah contoh program sederhana yang menulis ulang parameter baris perintahnya sebagai
bilangan bulat yang diformat dengan benar di lokal saat ini:
gunakan POSIX qw(locale_h);
# Dapatkan beberapa parameter pemformatan numerik lokal
saya ($ribuan_sep, $pengelompokan) =
@{localeconv()}{'thousands_sep', 'pengelompokan'};
# Terapkan default jika nilai tidak ada
$ribuan_sep = ',' kecuali $ribuan_sep;
# pengelompokan dan pengelompokan mon_adalah daftar yang dikemas
# bilangan bulat kecil (karakter) yang memberi tahu
# pengelompokan (seribu_sep dan mon_seribu_sep
# menjadi pembagi grup) dari angka dan
# jumlah uang. Arti dari bilangan bulat:
# 255 berarti tidak ada lagi pengelompokan, 0 berarti ulangi
# pengelompokan sebelumnya, 1-254 berarti gunakan itu
# sebagai pengelompokan saat ini. Pengelompokan dimulai dari
# kanan ke kiri (digit rendah ke tinggi). Dalam
#di bawah ini kami sedikit curang dengan tidak pernah menggunakan apapun
# selain pengelompokan pertama (apa pun itu).
if ($pengelompokan) {
@grouping = unpack("C*", $grouping);
} Else {
@pengelompokan = (3);
}
# Format params baris perintah untuk lokal saat ini
untuk (@ARGV) {
$_ = int; # Potong bagian yang bukan bilangan bulat
1 sementara
s/(\d)(\d{$grouping[0]}($|$ribuan_sep))/$1$ribuan_sep$2/;
cetak "$_";
}
cetak "\n";
Perhatikan bahwa jika platform tidak memiliki "LC_NUMERIC" dan/atau "LC_MONETARY" tersedia atau
diaktifkan, elemen hash yang sesuai akan hilang.
I18N::Langinfo
Antarmuka lain untuk menanyakan informasi yang bergantung pada lokal adalah
Fungsi "I18N::Langinfo::langinfo()", tersedia setidaknya di sistem mirip Unix dan VMS.
Contoh berikut akan mengimpor fungsi "langinfo()" itu sendiri dan tiga konstanta ke
digunakan sebagai argumen untuk "langinfo()": konstanta untuk hari pertama yang disingkat dalam seminggu
(penomoran dimulai dari Minggu = 1) dan dua konstanta lagi untuk afirmatif dan
jawaban negatif untuk pertanyaan ya/tidak di lokasi saat ini.
gunakan I18N::Langinfo qw(langinfo ABDAY_1 YESSTR NOSTR);
saya ($abday_1, $yesstr, $nostr)
= peta { langinfo } qw(ABDAY_1 YA NOSTR);
print "$abday_1? [$yesstr/$nostr]";
Dengan kata lain, di lokal "C" (atau bahasa Inggris) di atas mungkin akan mencetak sesuatu
seperti:
Matahari? [ya Tidak]
Lihat I18N::Langinfo untuk informasi lebih lanjut.
LOKAL KATEGORI
Subbagian berikut menjelaskan kategori lokal dasar. Di luar ini, beberapa
kategori kombinasi memungkinkan manipulasi lebih dari satu kategori dasar pada suatu waktu. Melihat
"LINGKUNGAN" untuk diskusi ini.
Kategori "LC_COLLATE": Pemeriksaan
Dalam lingkup formulir "gunakan lokal" yang mencakup pemeriksaan, Perl melihat ke
Variabel lingkungan "LC_COLLATE" untuk menentukan gagasan aplikasi tentang susunan
(pengurutan) karakter. Misalnya, "b" mengikuti "a" dalam abjad Latin, tetapi di mana do
"a" dan "aa" milik? Dan sementara "warna" mengikuti "cokelat" dalam bahasa Inggris, bagaimana dengan di
Spanyol tradisional?
Semua susunan berikut masuk akal dan Anda mungkin bertemu salah satu dari mereka jika Anda "menggunakan lokal".
ABCDE abcde
A a B b C c D d E e
a A b B c C d D e E
abcde ABCDE
Berikut adalah cuplikan kode untuk memberi tahu karakter "kata" apa yang ada di lokal saat ini, dalam hal itu
pesanan lokal:
gunakan lokal;
print +(sort grep /\w/, map { chr } 0..255), "\n";
Bandingkan ini dengan karakter yang Anda lihat dan urutannya jika Anda menyatakan secara eksplisit bahwa
lokal harus diabaikan:
tidak ada lokal;
print +(sort grep /\w/, map { chr } 0..255), "\n";
Susunan asli mesin ini (yang Anda dapatkan kecuali "gunakan lokal" telah muncul
sebelumnya di blok yang sama) harus digunakan untuk menyortir data biner mentah, sedangkan lokal-
susunan dependen dari contoh pertama berguna untuk teks alami.
Sebagaimana dicatat dalam "MENGUNAKAN LOCALES", "cmp" membandingkan menurut lokal susunan saat ini ketika
"gunakan lokal" berlaku, tetapi kembali ke perbandingan karakter demi karakter untuk string yang
lokal mengatakan sama. Anda dapat menggunakan "POSIX::strcoll()" jika Anda tidak ingin musim gugur ini-
kembali:
gunakan POSIX qw(strcoll);
$sama_dalam_lokal =
!strcoll("spasi dan huruf diabaikan", "SpaceAndCaseIgnored");
$equal_in_locale akan menjadi true jika lokal collation menentukan pemesanan seperti kamus
yang mengabaikan karakter spasi sepenuhnya dan yang melipat huruf besar-kecil.
Perl saat ini hanya mendukung lokal byte tunggal untuk "LC_COLLATE". Ini berarti bahwa
Lokal UTF-8 kemungkinan hanya akan memberi Anda pemesanan asli mesin. Gunakan Unicode::Collate untuk
implementasi penuh dari Algoritma Collation Unicode.
Jika Anda memiliki satu string yang ingin Anda periksa "kesetaraan di lokal" terhadap
beberapa orang lain, Anda mungkin berpikir Anda bisa mendapatkan sedikit efisiensi dengan menggunakan
"POSIX::strxfrm()" bersama dengan "eq":
gunakan POSIX qw(strxfrm);
$xfrm_string = strxfrm("String huruf besar campur");
print "pengumpulan lokal mengabaikan spasi\n"
if $xfrm_string eq strxfrm("Campuran-casestring");
print "penyusunan lokal mengabaikan tanda hubung\n"
if $xfrm_string eq strxfrm("String huruf campur");
print "pengumpulan lokal mengabaikan huruf besar\n"
if $xfrm_string eq strxfrm("string huruf campuran");
"strxfrm()" mengambil string dan memetakannya menjadi string yang diubah untuk digunakan dalam char-by-char
perbandingan terhadap string yang diubah lainnya selama pengumpulan. "Di bawah kap", lokal-
operator perbandingan Perl yang terpengaruh memanggil "strxfrm()" untuk kedua operan, lalu melakukan char-by-
perbandingan char dari string yang diubah. Dengan memanggil "strxfrm()" secara eksplisit dan menggunakan a
perbandingan yang tidak terpengaruh lokal, contoh mencoba menyimpan beberapa transformasi.
Namun kenyataannya, itu tidak menyimpan apa pun: Perl magic (lihat "Variabel Ajaib" di perlguts)
membuat versi string yang diubah saat pertama kali dibutuhkan dalam perbandingan,
lalu simpan versi ini jika diperlukan lagi. Contoh ditulis ulang yang mudah
cara dengan "cmp" berjalan hampir sama cepatnya. Itu juga mengatasi karakter nol yang tertanam di
string; jika Anda memanggil "strxfrm()" secara langsung, ia akan memperlakukan null pertama yang ditemukan sebagai a
penghenti. jangan berharap string yang diubah yang dihasilkannya menjadi portabel di seluruh
sistem--atau bahkan dari satu revisi sistem operasi Anda ke yang berikutnya. Singkatnya, jangan
panggil "strxfrm()" secara langsung: biarkan Perl melakukannya untuk Anda.
Catatan: "gunakan lokal" tidak ditampilkan dalam beberapa contoh berikut karena tidak diperlukan:
"strcoll()" dan "strxfrm()" adalah fungsi POSIX yang menggunakan standar yang disediakan sistem
fungsi "libc" yang selalu mematuhi lokal "LC_COLLATE" saat ini.
Kategori "LC_CTYPE": Karakter jenis
Dalam lingkup formulir "gunakan lokal" yang menyertakan "LC_CTYPE", Perl mematuhi "LC_CTYPE"
pengaturan lokal. Ini mengontrol gagasan aplikasi tentang karakter mana yang
abjad, numerik, tanda baca, dll. Ini memengaruhi ekspresi reguler "\w" Perl
metanotation, yang merupakan singkatan dari karakter alfanumerik--yaitu, alfabet, numerik, dan
garis bawah asli platform. (Konsultasikan perlre untuk informasi lebih lanjut tentang reguler
ekspresi.) Berkat "LC_CTYPE", tergantung pada pengaturan lokal Anda, karakter seperti
"ae", "`", "ss", dan "o" dapat dipahami sebagai karakter "\w". Itu juga mempengaruhi banyak hal
seperti "\s", "\D", dan kelas karakter POSIX, seperti "[[:grafik:]]". (Melihat
perlrecharclass untuk informasi lebih lanjut tentang semua ini.)
Lokal "LC_CTYPE" juga menyediakan peta yang digunakan dalam mentransliterasi karakter antara
huruf kecil dan huruf besar. Ini mempengaruhi fungsi pemetaan kasus--"fc()", "lc()",
"lcfirst()", "uc()", dan "ucfirst()"; interpolasi pemetaan kasus dengan "\F", "\l", "\L",
"\u", atau "\U" dalam string bertanda kutip ganda dan substitusi "s///"; dan kasus-independen
pencocokan pola ekspresi reguler menggunakan pengubah "i".
Akhirnya, "LC_CTYPE" memengaruhi tes kelas karakter POSIX (usang)
fungsi--"POSIX::isalpha()", "POSIX::islower()", dan seterusnya. Misalnya, jika Anda bergerak
dari lokal "C" ke ISO 7 646-bit, Anda mungkin menemukan--mungkin mengejutkan Anda--bahwa
"|" berpindah dari kelas "POSIX::ispunct()" ke "POSIX::isalpha()". Sayangnya, ini
menciptakan masalah besar untuk ekspresi reguler. "|" tetap berarti pergantian meskipun itu
cocok dengan "\w". Mulai v5.22, peringatan akan dimunculkan ketika lokal seperti itu diaktifkan
ke dalam. Rincian lebih lanjut diberikan beberapa paragraf lebih jauh ke bawah.
Mulai dari v5.20, Perl mendukung lokal UTF-8 untuk "LC_CTYPE", tetapi hanya Perl
mendukung lokal byte tunggal, seperti seri ISO 8859. Ini berarti karakter yang luas
lokal, misalnya untuk bahasa Asia, tidak didukung dengan baik. (Jika platform memiliki
kemampuan Perl untuk mendeteksi lokal seperti itu, mulai dari Perl v5.22, Perl akan memperingatkan,
default diaktifkan, menggunakan kategori peringatan "lokal", setiap kali lokal tersebut diaktifkan
ke dalam.) Dukungan lokal UTF-8 sebenarnya adalah superset dari lokal POSIX, karena itu
perilaku Unicode yang benar-benar penuh seolah-olah tidak ada lokal "LC_CTYPE" yang berlaku sama sekali (kecuali untuk
menodai; lihat "KEAMANAN"). Lokal POSIX, bahkan yang UTF-8, tidak memiliki konsep tertentu
di Unicode, seperti gagasan bahwa mengubah kasus karakter dapat berkembang menjadi lebih
dari satu karakter. Perl di lokal UTF-8, akan memberi Anda ekspansi itu. Sebelum
v5.20, Perl memperlakukan lokal UTF-8 pada beberapa platform seperti ISO 8859-1, dengan beberapa
pembatasan, dan pada platform lain lebih seperti lokal "C". Untuk rilis v5.16 dan
v5.18, "gunakan lokal 'not_characters" dapat digunakan sebagai solusi untuk ini (lihat "Unicode
dan UTF-8").
Perhatikan bahwa ada beberapa hal yang tidak terpengaruh oleh lokal saat ini. Setiap
karakter literal adalah karakter asli untuk platform yang diberikan. Oleh karena itu 'A' berarti
karakter pada kode titik 65 pada platform ASCII, dan 193 pada EBCDIC. Itu mungkin atau mungkin tidak
sebuah 'A' di lokal saat ini, jika lokal itu bahkan memiliki 'A'. Demikian pula, semua pelarian
urutan untuk karakter tertentu, "\n" misalnya, selalu berarti asli platform
satu. Ini berarti, misalnya, bahwa "\N" dalam ekspresi reguler (setiap karakter kecuali yang baru-
line) bekerja pada set karakter platform.
Mulai v5.22, Perl akan secara default memperingatkan saat beralih ke lokal yang didefinisikan ulang
setiap karakter ASCII yang dapat dicetak (ditambah "\t" dan "\n") ke dalam kelas yang berbeda dari yang diharapkan.
Ini mungkin terjadi pada lokal modern hanya pada platform EBCDIC, di mana, misalnya, a
CCSID 0037 lokal pada mesin CCSID 1047 bergerak "[", tetapi dapat terjadi pada platform ASCII
dengan ISO 646 dan lokal 7-bit lainnya yang pada dasarnya sudah usang. Hal-hal mungkin masih
bekerja, tergantung pada fitur Perl apa yang digunakan oleh program. Misalnya, di
contoh dari atas di mana "|" menjadi "\w", dan tidak ada ekspresi reguler di mana
ini penting, program mungkin masih berfungsi dengan baik. Peringatan mencantumkan semua karakter
yang dapat ditentukan dapat terpengaruh secara merugikan.
Catatan: Definisi lokal "LC_CTYPE" yang rusak atau berbahaya dapat mengakibatkan jelas tidak memenuhi syarat
karakter yang dianggap alfanumerik oleh aplikasi Anda. Untuk pencocokan ketat
dari (biasa) huruf dan angka ASCII--misalnya, dalam string perintah--locale-aware
aplikasi harus menggunakan "\w" dengan pengubah ekspresi reguler "/a". Lihat "Keamanan".
Kategori "LC_NUMERIC": Numeric format
Setelah panggilan "POSIX::setlocale()" yang tepat, dan dalam lingkup formulir "gunakan lokal"
yang mencakup angka, Perl mematuhi informasi lokal "LC_NUMERIC", yang mengontrol dan
ide aplikasi tentang bagaimana angka harus diformat untuk keterbacaan manusia. Di sebagian besar
implementasi satu-satunya efek adalah mengubah karakter yang digunakan untuk desimal
titik--mungkin dari "." ke ",". Fungsinya tidak menyadari hal-hal sepele seperti ribuan
perpisahan dan sebagainya. (Lihat "Fungsi localeconv" jika Anda peduli dengan hal-hal ini.)
gunakan POSIX qw(strtod setlocale LC_NUMERIC);
gunakan lokal;
setlocale LC_NUMERIC, "";
$n = 5/2; # Tetapkan angka 2.5 ke $n
$a = " $n"; # Konversi tergantung lokal ke string
print "setengah lima adalah $n\n"; # Output tergantung lokal
printf "setengah lima adalah %g\n", $n; # Output tergantung lokal
print "TITIK DESIMAL ADALAH KOMA\n"
if $n == (strtod("2,5"))[0]; # Konversi tergantung lokal
Lihat juga I18N::Langinfo dan "RADIXCHAR".
Kategori "LC_MONETARY": format of moneter jumlah
Standar C mendefinisikan kategori "LC_MONETARY", tetapi bukan fungsi yang dipengaruhi oleh
isinya. (Mereka yang berpengalaman dalam komite standar akan menyadari bahwa:
kelompok kerja memutuskan untuk menyepakati masalah ini.) Akibatnya, Perl pada dasarnya tidak mengambil
pemberitahuan itu. Jika Anda benar-benar ingin menggunakan "LC_MONETARY", Anda dapat menanyakan isinya--lihat
"Fungsi localeconv"--dan gunakan informasi yang dikembalikannya di aplikasi Anda
format sendiri jumlah mata uang. Namun, Anda mungkin menemukan bahwa informasi,
tebal dan kompleks meskipun mungkin, masih belum cukup memenuhi kebutuhan Anda:
pemformatan mata uang adalah hal yang sulit untuk dipecahkan.
Lihat juga I18N::Langinfo dan "CRNCYSTR".
"LC_TIME"
Output yang dihasilkan oleh "POSIX::strftime()", yang membangun tanggal/waktu yang dapat dibaca manusia yang diformat
string, dipengaruhi oleh lokal "LC_TIME" saat ini. Jadi, dalam bahasa Prancis, outputnya
diproduksi oleh elemen format %B (nama bulan penuh) untuk bulan pertama tahun ini akan
menjadi "janvier". Berikut cara mendapatkan daftar nama bulan yang panjang di lokal saat ini:
gunakan POSIX qw(strftime);
untuk (0) {
$long_bulan_nama[$_] =
strftime("%B", 0, 0, 0, 1, $_, 96);
}
Catatan: "gunakan lokal" tidak diperlukan dalam contoh ini: "strftime()" adalah fungsi POSIX yang
menggunakan fungsi "libc" yang disediakan sistem standar yang selalu mematuhi "LC_TIME" saat ini
lokal.
Lihat juga I18N::Langinfo dan "ABDAY_1".."ABDAY_7", "DAY_1".."DAY_7", "ABMON_1".."ABMON_12",
dan "ABMON_1".."ABMON_12".
Lainnya kategori
Kategori lokal yang tersisa saat ini tidak digunakan oleh Perl sendiri. Tapi sekali lagi perhatikan
bahwa hal-hal yang berinteraksi dengan Perl dapat menggunakan ini, termasuk ekstensi di luar standar
Distribusi Perl, dan oleh sistem operasi dan utilitasnya. Perhatikan terutama bahwa
nilai string $! dan pesan kesalahan yang diberikan oleh utilitas eksternal dapat diubah
oleh "LC_MESSAGES". Jika Anda ingin memiliki kode kesalahan portabel, gunakan "%!". Lihat Errno.
KEAMANAN
Meskipun diskusi utama tentang masalah keamanan Perl dapat ditemukan di perlsec, diskusi
penanganan lokal Perl tidak akan lengkap jika tidak menarik perhatian Anda ke lokal
masalah keamanan yang bergantung. Lokal--khususnya pada sistem yang memungkinkan pengguna yang tidak memiliki hak istimewa
untuk membangun lokal mereka sendiri--tidak dapat dipercaya. Lokal berbahaya (atau hanya rusak)
dapat membuat aplikasi yang sadar-lokal memberikan hasil yang tidak terduga. Berikut adalah beberapa
kemungkinan:
· Pemeriksaan ekspresi reguler untuk nama file atau alamat email yang aman menggunakan "\w" mungkin
dipalsukan oleh lokal "LC_CTYPE" yang mengklaim bahwa karakter seperti ">" dan "|" adalah
alfanumerik.
· Interpolasi string dengan pemetaan huruf besar-kecil, seperti, misalnya, "$dest = "C:\U$name.$ext"", mungkin
menghasilkan hasil yang berbahaya jika tabel pemetaan kasus "LC_CTYPE" palsu sedang berlaku.
· Lokal "LC_COLLATE" yang licik dapat menghasilkan nama siswa dengan nilai "D"
muncul di depan orang-orang dengan "A".
· Aplikasi yang kesulitan menggunakan informasi dalam "LC_MONETARY" dapat memformat
mendebit seolah-olah mereka kredit dan sebaliknya jika lokal itu telah ditumbangkan. Atau
mungkin melakukan pembayaran dalam dolar AS, bukan dolar Hong Kong.
· Nama tanggal dan hari dalam tanggal yang diformat oleh "strftime()" dapat dimanipulasi untuk
keuntungan oleh pengguna jahat yang dapat menumbangkan lokal "LC_DATE". ("Lihat--dikatakan aku
tidak ada di gedung pada hari Minggu.")
Bahaya seperti itu tidak khas pada sistem lokal: aspek apa pun dari aplikasi
lingkungan yang dapat dimodifikasi dengan jahat menghadirkan tantangan serupa. Demikian pula,
mereka tidak khusus untuk Perl: bahasa pemrograman apa pun yang memungkinkan Anda menulis program
yang memperhitungkan lingkungan mereka menghadapkan Anda pada masalah ini.
Perl tidak dapat melindungi Anda dari semua kemungkinan yang ditunjukkan dalam contoh--tidak ada
menggantikan kewaspadaan Anda sendiri--tetapi, ketika "gunakan lokal" berlaku, Perl menggunakan
mekanisme pewarnaan (lihat perlsec) untuk menandai hasil string yang menjadi tergantung-lokal, dan
yang mungkin tidak dapat dipercaya sebagai konsekuensinya. Berikut adalah ringkasan dari perilaku menodai
operator dan fungsi yang mungkin terpengaruh oleh lokal:
· Perbandingan operator ("lt", "le", "ge", "gt" dan "cmp"):
Hasil skalar benar/salah (atau kurang/sama/lebih besar) tidak pernah ternoda.
· Pemetaan kasus interpolasi (dengan "\l", "\L", "\u", "\U", atau "\F")
String hasil yang berisi materi interpolasi tercemar jika bentuk "gunakan lokal"
yang menyertakan "LC_CTYPE" berlaku.
· Sesuai operator ("M//"):
Hasil skalar benar/salah tidak pernah tercemar.
Semua subpola, baik dikirim sebagai hasil konteks daftar atau sebagai $1 dll., tercemar
jika formulir "gunakan lokal" yang menyertakan "LC_CTYPE" berlaku, dan subpola
ekspresi reguler berisi konstruksi yang bergantung pada lokal. Konstruksi ini termasuk
"\w" (untuk mencocokkan karakter alfanumerik), "\W" (karakter non-alfanumerik), "\b" dan
"\B" (batas kata dan non-batas, yang bergantung pada apa yang cocok dengan "\w" dan "\W"), "\s"
(karakter spasi), "\S" (karakter bukan spasi), "\d" dan "\D" (digit dan
non-digit), dan kelas karakter POSIX, seperti "[:alpha:]" (lihat "POSIX
Kelas Karakter" di perlrecharclass).
Penodaan juga mungkin terjadi jika polanya akan dicocokkan dengan tidak peka huruf besar/kecil (melalui "/i").
Pengecualian adalah jika semua poin kode yang akan dicocokkan dengan cara ini di atas 255 dan lakukan
tidak memiliki lipatan di bawah aturan Unicode hingga di bawah 256. Penodaan tidak dilakukan untuk ini
karena Perl hanya menggunakan aturan Unicode untuk poin kode tersebut, dan aturan itu adalah
sama tidak peduli apa lokal saat ini.
Variabel pola yang cocok, $&, "$`" (pra-pertandingan), "$'" (pasca-pertandingan), dan $+ (terakhir
pertandingan) juga tercemar.
· Substitusi operator ("S///"):
Memiliki perilaku yang sama dengan operator pertandingan. Juga, operan kiri dari "=~" menjadi
tercemar ketika formulir "gunakan lokal" yang menyertakan "LC_CTYPE" berlaku, jika dimodifikasi sebagai
hasil dari substitusi berdasarkan kecocokan ekspresi reguler yang melibatkan salah satu dari
hal-hal yang disebutkan dalam item sebelumnya, atau pemetaan kasus, seperti "\l", "\L","\u",
"\U", atau "\F".
· Keluaran format fungsi ("printf()" dan "write()"):
Hasil tidak pernah ternoda karena sebaliknya bahkan hasil cetak, misalnya
"print(1/7)", harus dinodai jika "gunakan lokal" berlaku.
· Pemetaan kasus fungsi ("lc()", "lcfirst()", "uc()", "ucfirst()"):
Hasil tercemar jika formulir "gunakan lokal" yang menyertakan "LC_CTYPE" berlaku.
· POSIX tergantung lokal fungsi ("localeconv()", "strcoll()", "strftime()",
"strxfrm()"):
Hasil tidak pernah ternoda.
· POSIX karakter kelas tes ("POSIX::isalnum()", "POSIX::isalpha()",
"POSIX::isdigit()", "POSIX::isgraph()", "POSIX::islower()", "POSIX::isprint()",
"POSIX::ispunct()", "POSIX::isspace()", "POSIX::isupper()", "POSIX::isxdigit()"):
Hasil benar/salah tidak pernah ternoda.
Tiga contoh menggambarkan pewarnaan yang bergantung pada lokal. Program pertama, yang mengabaikannya
lokal, tidak akan dijalankan: nilai yang diambil langsung dari baris perintah tidak boleh digunakan untuk menamai
file output saat pemeriksaan taint diaktifkan.
#/usr/local/bin/Perl -T
# Jalankan dengan pemeriksaan noda
# Pemeriksaan kewarasan baris perintah dihilangkan...
$tainted_output_file = ubah;
buka(F, ">$tainted_output_file")
atau peringatkan "Pembukaan $tainted_output_file gagal: $!\n";
Program dapat dibuat untuk dijalankan dengan "mencuci" nilai tercemar melalui reguler
ekspresi: contoh kedua--yang masih mengabaikan informasi lokal--berjalan, membuat
file bernama pada baris perintahnya jika bisa.
#/usr/local/bin/Perl -T
$tainted_output_file = ubah;
$tainted_output_file =~ m%[\w/]+%;
$untainted_output_file = $&;
buka(F, ">$untainted_output_file")
atau peringatkan "Pembukaan $untainted_output_file gagal: $!\n";
Bandingkan ini dengan program serupa tetapi sadar lokal:
#/usr/local/bin/Perl -T
$tainted_output_file = ubah;
gunakan lokal;
$tainted_output_file =~ m%[\w/]+%;
$localized_output_file = $&;
buka(F, ">$localized_output_file")
atau peringatkan "Pembukaan $localized_output_file gagal: $!\n";
Program ketiga ini gagal dijalankan karena $& tercemar: itu adalah hasil pertandingan
melibatkan "\w" saat "gunakan lokal" berlaku.
LINGKUNGAN
PERL_SKIP_LOCALE_INIT
Variabel lingkungan ini, tersedia mulai dari Perl v5.20, jika disetel (ke any
value), memberitahu Perl untuk tidak menggunakan variabel lingkungan lainnya untuk
inisialisasi dengan. Sebaliknya, Perl menggunakan apa pun pengaturan lokal saat ini.
Ini sangat berguna di lingkungan tertanam, lihat "Menggunakan Perl . yang disematkan"
dengan POSIX lokal" di perlembed.
PERL_BADLANG
String yang dapat menekan peringatan Perl tentang pengaturan lokal yang gagal di
memulai. Kegagalan dapat terjadi jika dukungan lokal di sistem operasi adalah
kurang (rusak) dalam beberapa hal--atau jika Anda salah mengetik nama lokal saat Anda
mengatur lingkungan Anda. Jika variabel lingkungan ini tidak ada, atau memiliki
nilai selain "0" atau "", Perl akan mengeluh tentang kegagalan pengaturan lokal.
CATATAN: "PERL_BADLANG" hanya memberi Anda cara untuk menyembunyikan pesan peringatan. Itu
pesan menceritakan tentang beberapa masalah dalam dukungan lokal sistem Anda, dan Anda
harus menyelidiki apa masalahnya.
DPKG_RUNNING_VERSION
Pada sistem Debian, jika variabel lingkungan DPKG_RUNNING_VERSION disetel (ke
nilai apa pun), peringatan kegagalan lokal akan ditekan seperti halnya dengan a
nol pengaturan PERL_BADLANG. Hal ini dilakukan untuk menghindari banjir peringatan palsu
selama peningkatan sistem. Melihathttp://bugs.debian.org/508764>.
Variabel lingkungan berikut tidak spesifik untuk Perl: Mereka adalah bagian dari
metode standar (ISO C, XPG4, POSIX 1.c) "setlocale()" untuk mengontrol dan
pendapat aplikasi tentang data. Windows bukan POSIX, tetapi Perl mengatur hal berikut:
untuk bekerja seperti yang dijelaskan pula. Jika lokal yang diberikan oleh variabel lingkungan tidak valid,
Perl mencoba yang lebih rendah berikutnya dalam prioritas. Jika tidak ada yang valid, pada Windows, sistem
lokal default kemudian dicoba. Jika semuanya gagal, lokal "C" digunakan. Bahkan jika itu
tidak berfungsi, ada sesuatu yang rusak parah, tetapi Perl mencoba untuk terus maju dengan apa pun yang
pengaturan lokal mungkin.
"LC_ALL" "LC_ALL" adalah variabel lingkungan lokal "override-all". Jika diatur, itu
menimpa semua variabel lingkungan lokal lainnya.
"BAHASA" CATATAN: "LANGUAGE" adalah ekstensi GNU, ini hanya memengaruhi Anda jika Anda menggunakan
GNU libc. Ini adalah kasus jika Anda menggunakan misalnya Linux. Jika Anda menggunakan
Unix "komersial" Anda kemungkinan besar tidak menggunakan GNU libc dan Anda bisa
abaikan "BAHASA".
Namun, jika Anda menggunakan "LANGUAGE": ini memengaruhi bahasa
informasi, peringatan, dan pesan kesalahan yang dikeluarkan oleh perintah (dengan kata lain,
itu seperti "LC_MESSAGES") tetapi memiliki prioritas lebih tinggi daripada "LC_ALL". Lebih-lebih lagi,
itu bukan nilai tunggal melainkan "jalur" (":" -daftar yang dipisahkan) dari bahasa
(bukan lokal). Lihat dokumentasi perpustakaan "gettext" GNU untuk lebih lanjut
informasi.
"LC_CTYPE" Dengan tidak adanya "LC_ALL", "LC_CTYPE" memilih jenis karakter lokal. Di
tidak adanya "LC_ALL" dan "LC_CTYPE", "LANG" memilih jenis karakter
lokal.
"LC_COLLATE"
Dengan tidak adanya "LC_ALL", "LC_COLLATE" memilih susunan (penyortiran)
lokal. Dengan tidak adanya "LC_ALL" dan "LC_COLLATE", "LANG" memilih
lokal collation.
"LC_MONETARY"
Dengan tidak adanya "LC_ALL", "LC_MONETARY" memilih format moneter
lokal. Dengan tidak adanya "LC_ALL" dan "LC_MONETARY", "LANG" memilih
lokal pemformatan moneter.
"LC_NUMERIC"
Dengan tidak adanya "LC_ALL", "LC_NUMERIC" memilih lokal format numerik.
Dengan tidak adanya "LC_ALL" dan "LC_NUMERIC", "LANG" memilih numerik
Format.
"LC_TIME" Dengan tidak adanya "LC_ALL", "LC_TIME" memilih format tanggal dan waktu
lokal. Dengan tidak adanya "LC_ALL" dan "LC_TIME", "LANG" memilih
lokal pemformatan tanggal dan waktu.
"LANG" "LANG" adalah variabel lingkungan lokal "catch-all". Jika diatur, itu adalah
digunakan sebagai pilihan terakhir setelah keseluruhan "LC_ALL" dan kategori khusus
"LC_foo".
contoh
"LC_NUMERIC" mengontrol keluaran numerik:
gunakan lokal;
gunakan POSIX qw(locale_h); # Mengimpor setlocale() dan konstanta LC_.
setlocale(LC_NUMERIC, "fr_FR") atau die "Maaf";
printf "%g\n", 1.23; # Jika "fr_FR" berhasil, mungkin menunjukkan 1,23.
dan juga bagaimana string diuraikan oleh "POSIX::strtod()" sebagai angka:
gunakan lokal;
gunakan POSIX qw(locale_h strtod);
setlocale(LC_NUMERIC, "de_DE") atau die "Entschuldigung";
saya $x = strtod("2,34") + 5;
cetak $x, "\n"; # Mungkin menunjukkan 7,34.
CATATAN
String "eval" dan "LC_NUMERIC"
Sebuah eval string mem-parsing ekspresinya sebagai Perl standar. Oleh karena itu mengharapkan
titik desimal menjadi titik. Jika "LC_NUMERIC" disetel agar ini menjadi koma,
parsing akan bingung, mungkin diam-diam.
gunakan lokal;
gunakan POSIX qw(locale_h);
setlocale(LC_NUMERIC, "fr_FR") atau die "Maaf";
$a saya = 1.2;
print eval "$a + 1.5";
cetak "\n";
mencetak "13,5". Ini karena di lokal itu, koma adalah karakter titik desimal.
Dengan demikian, "eval" berkembang menjadi:
nilai "1,2 + 1.5"
dan hasilnya tidak seperti yang Anda harapkan. Tidak ada peringatan yang dihasilkan. Jika kamu melakukan
string "eval" dalam lingkup "gunakan lokal", Anda harus mengubah "eval"
baris untuk melakukan sesuatu seperti:
print eval "tidak ada lokal; $a + 1.5";
Ini mencetak 2.7.
Anda juga dapat mengecualikan "LC_NUMERIC", jika Anda tidak membutuhkannya, dengan
gunakan lokal ':!numerik';
Ke belakang kesesuaian
Versi Perl sebelum 5.004 kebanyakan mengabaikan informasi lokal, umumnya berperilaku sebagai
jika sesuatu yang mirip dengan lokal "C" selalu berlaku, bahkan jika programnya
lingkungan menyarankan sebaliknya (lihat "Fungsi setlocale"). Secara default, Perl masih
berperilaku seperti ini untuk kompatibilitas mundur. Jika Anda ingin aplikasi Perl membayar
memperhatikan informasi lokal, Anda harus gunakan pragma "gunakan lokal" (lihat "penggunaan"
locale" pragma") atau, jika Anda ingin melakukannya hanya untuk pola
pencocokan, pengubah ekspresi reguler "/l" (lihat "Pengubah set karakter" di perlre)
untuk menginstruksikannya untuk melakukannya.
Versi Perl dari 5.002 hingga 5.003 memang menggunakan informasi "LC_CTYPE" jika tersedia; itu
adalah, "\w" mengerti huruf apa yang sesuai dengan lingkungan lokal
variabel. Masalahnya adalah bahwa pengguna tidak memiliki kendali atas fitur tersebut: jika C
perpustakaan yang didukung lokal, Perl menggunakannya.
I18N: Susun usang
Dalam versi Perl sebelum 5.004, susunan per-lokal dimungkinkan menggunakan
Modul perpustakaan "I18N::Collate". Modul ini sekarang agak usang dan harus dihindari
dalam aplikasi baru. Fungsionalitas "LC_COLLATE" sekarang terintegrasi ke dalam inti Perl
bahasa: Seseorang dapat menggunakan data skalar khusus lokal sepenuhnya secara normal dengan "gunakan lokal",
jadi tidak perlu lagi berkutat dengan referensi skalar "I18N::Collate".
Jenis kecepatan dan ingatan menggunakan Dampak
Membandingkan dan menyortir menurut lokal biasanya lebih lambat dari penyortiran default; perlambatan
dua sampai empat kali telah diamati. Ini juga akan menghabiskan lebih banyak memori: sekali Perl
variabel skalar telah berpartisipasi dalam perbandingan string atau operasi pengurutan apa pun yang mematuhi
aturan collation lokal, dibutuhkan memori 3-15 kali lebih banyak dari sebelumnya. (Tepat
pengganda tergantung pada konten string, sistem operasi, dan lokal.) Ini
kerugian lebih ditentukan oleh implementasi sistem operasi dari sistem lokal
daripada oleh Perl.
Dengan bebas tersedia Lokal definisi
Proyek Unicode CLDR mengekstrak bagian POSIX dari banyak lokalnya, tersedia di
http://unicode.org/Public/cldr/latest/
Ada banyak koleksi definisi lokal di:
http://std.dkuug.dk/i18n/WG15-collection/locales/
Anda harus menyadari bahwa itu tidak didukung, dan tidak diklaim cocok untuk tujuan apa pun.
Jika sistem Anda mengizinkan instalasi lokal yang berubah-ubah, Anda mungkin menemukan definisinya
berguna sebagaimana adanya, atau sebagai dasar untuk pengembangan lokal Anda sendiri.
Saya18n dan L10n
"Internasionalisasi" sering disingkat sebagai I18n karena huruf pertama dan terakhirnya adalah
dipisahkan oleh delapan belas orang lainnya. (Anda mungkin menebak mengapa internalin ... internaliti ... i18n
cenderung disingkat.) Dengan cara yang sama, "lokalisasi" sering disingkat menjadi L10n.
An tidak sempurna standard
Internasionalisasi, sebagaimana didefinisikan dalam standar C dan POSIX, dapat dikritik sebagai:
tidak lengkap, kaku, dan memiliki granularitas yang terlalu besar. (Lokal berlaku untuk keseluruhan
proses, ketika bisa dibilang akan lebih berguna untuk menerapkannya ke satu utas,
kelompok jendela, atau apa pun.) Mereka juga memiliki kecenderungan, seperti kelompok standar, untuk membagi
dunia menjadi bangsa-bangsa, ketika kita semua tahu bahwa dunia dapat dibagi dengan baik menjadi
bankir, bikers, gamer, dan sebagainya.
Unicode dan UTF-8
Dukungan Unicode baru dimulai dari Perl versi v5.6, dan diimplementasikan lebih lengkap
dalam versi v5.8 dan yang lebih baru. Lihat perluniintro.
Mulai di Perl v5.20, lokal UTF-8 didukung di Perl, kecuali untuk "LC_COLLATE" (gunakan
Unicode::Collate sebagai gantinya). Jika Anda memiliki Perl v5.16 atau v5.18 dan tidak dapat memutakhirkan, Anda dapat menggunakan
gunakan lokal ':not_characters';
Ketika bentuk pragma ini digunakan, hanya bagian lokal yang bukan karakter yang digunakan
oleh Perl, misalnya "LC_NUMERIC". Perl berasumsi bahwa Anda telah menerjemahkan semua
karakter itu untuk beroperasi ke dalam Unicode (sebenarnya set karakter asli platform
(ASCII atau EBCDIC) ditambah Unicode). Untuk data dalam file, ini dapat dengan mudah dilakukan dengan juga
menentukan
gunakan buka ':lokal';
Pragma ini mengatur semua input dari file untuk diterjemahkan ke dalam Unicode dari
lokal saat ini sebagaimana ditentukan dalam lingkungan (lihat "LINGKUNGAN"), dan semua output ke
file yang akan diterjemahkan kembali ke lokal. (Lihat terbuka). Pada basis per-penanganan file, Anda
sebagai gantinya dapat menggunakan modul PerlIO::locale, atau modul Encode::Locale, keduanya tersedia
dari CPAN. Modul terakhir juga memiliki metode untuk memudahkan penanganan "ARGV" dan
variabel lingkungan, dan dapat digunakan pada string individu. Jika Anda tahu bahwa semua Anda
lokal akan menjadi UTF-8, sebanyak hari ini, Anda dapat menggunakan -C saklar baris perintah.
Bentuk pragma ini pada dasarnya memungkinkan penanganan lokal yang mulus dengan Unicode. Itu
urutan susunan akan dengan urutan titik kode Unicode. Sangat disarankan bahwa ketika
Anda perlu memesan dan mengurutkan string yang Anda gunakan modul standar Unicode::Collate which
memberikan hasil yang jauh lebih baik dalam banyak kasus daripada yang bisa Anda dapatkan dengan lokal gaya lama
penanganan.
Semua modul dan sakelar yang baru saja dijelaskan dapat digunakan di v5.20 hanya dengan "penggunaan" biasa
locale", dan, jika input lokal bukan UTF-8, Anda akan mendapatkan yang kurang ideal
perilaku, dijelaskan di bawah, yang Anda dapatkan dengan Perls pra-v5.16, atau saat Anda menggunakan lokal
pragma tanpa parameter ":not_characters" di v5.16 dan v5.18. Jika Anda menggunakan
eksklusif UTF-8 lokal di v5.20 dan lebih tinggi, sisa bagian ini tidak berlaku untuk
Anda.
Ada dua kasus, lokal multi-byte dan single-byte. Multi-byte pertama:
Satu-satunya lokal multi-byte (atau karakter lebar) yang kemungkinan besar akan didukung Perl adalah
UTF-8. Ini karena kesulitan implementasi, fakta bahwa UTF-8 berkualitas tinggi
lokal sekarang diterbitkan untuk setiap wilayah di dunia
(<http://unicode.org/Public/cldr/latest/>), dan itu gagal semua yang dapat Anda gunakan
Encode modul untuk menerjemahkan ke/dari lokal Anda. Jadi, Anda harus melakukan salah satu dari hal-hal itu
jika Anda menggunakan salah satu dari lokal ini, seperti Big5 atau Shift JIS. Untuk lokal UTF-8, di
Perls (sebelum v5.20) yang tidak memiliki dukungan lokal UTF-8 penuh, mereka dapat bekerja dengan cukup baik
(tergantung pada implementasi pustaka C Anda) hanya karena keduanya dan Perl store
karakter yang mengambil beberapa byte dengan cara yang sama. Namun, beberapa, jika tidak sebagian besar, C
implementasi perpustakaan mungkin tidak memproses karakter di bagian atas Latin-1
rentang (128 - 255) dengan benar di bawah "LC_CTYPE". Untuk melihat apakah suatu karakter adalah tipe tertentu
di bawah lokal, Perl menggunakan fungsi seperti "isalnum()". Pustaka C Anda mungkin tidak berfungsi untuk
Lokal UTF-8 dengan fungsi-fungsi itu, alih-alih hanya bekerja di bawah perpustakaan luas yang lebih baru
berfungsi seperti "iswalnum()", yang tidak digunakan Perl. Lokal multi-byte ini adalah
diperlakukan seperti lokal byte tunggal, dan akan memiliki batasan yang dijelaskan di bawah ini.
Mulai Perl v5.22, pesan peringatan muncul ketika Perl mendeteksi lokal multi-byte
yang tidak sepenuhnya mendukung.
Untuk lokal byte tunggal, Perl umumnya mengambil taktik untuk menggunakan aturan lokal pada poin kode
yang bisa muat dalam satu byte, dan aturan Unicode untuk yang tidak bisa (meskipun ini bukan
diterapkan secara seragam, lihat catatan di akhir bagian ini). Ini mencegah banyak masalah
di lokal yang bukan UTF-8. Misalkan lokalnya adalah ISO8859-7, bahasa Yunani. Karakter di
0xD7 ada modal Chi. Tapi di lokal ISO8859-1, Latin1, itu adalah perkalian
tanda. Kelas karakter ekspresi reguler POSIX "[[:alpha:]]" akan cocok secara ajaib
0xD7 dalam bahasa Yunani tetapi tidak dalam bahasa Latin.
Namun, ada tempat di mana ini rusak. Konstruksi Perl tertentu adalah untuk Unicode
saja, seperti "\p{Alpha}". Mereka berasumsi bahwa 0xD7 selalu memiliki arti Unicode (atau
setara pada platform EBCDIC). Karena Latin1 adalah subset dari Unicode dan 0xD7 adalah
tanda perkalian dalam Latin1 dan Unicode, "\p{Alpha}" tidak akan pernah cocok,
terlepas dari lokal. Masalah serupa terjadi dengan "\N{...}". Sebelum v5.20, Ini adalah
oleh karena itu ide yang buruk untuk menggunakan "\p{}" atau "\N{}" di bawah "gunakan lokal"--kecuali kalau Anda bisa
menjamin bahwa lokal akan menjadi ISO8859-1. Gunakan kelas karakter POSIX sebagai gantinya.
Masalah lain dengan pendekatan ini adalah bahwa operasi yang melintasi satu byte/multiple
batas byte tidak terdefinisi dengan baik, dan karenanya tidak diizinkan. (Batas ini adalah antara
codepoints di 255/256.) Misalnya, huruf besar LATIN huruf kecil Y DENGAN DIAERESIS
(U+0178) harus mengembalikan HURUF KECIL LATIN Y DENGAN DIAERESIS (U+00FF). Tapi dalam bahasa Yunani
lokal, misalnya, tidak ada karakter di 0xFF, dan Perl tidak tahu apa
karakter di 0xFF benar-benar seharusnya mewakili. Jadi itu melarang operasi.
Dalam mode ini, huruf kecil dari U+0178 itu sendiri.
Masalah yang sama terjadi jika Anda mengaktifkan UTF-8-ifikasi otomatis dari file standar Anda
menangani, lapisan "buka ()" default, dan @ARGV pada lokal non-ISO8859-1, non-UTF-8 (dengan menggunakan
baik -C sakelar baris perintah atau variabel lingkungan "PERL_UNICODE"; melihat
perlrun). Hal-hal dibaca sebagai UTF-8, yang biasanya menyiratkan Unicode
interpretasi, tetapi kehadiran lokal menyebabkan mereka ditafsirkan dalam lokal itu
sebagai gantinya. Misalnya, titik kode 0xD7 di input Unicode, yang seharusnya berarti
tanda perkalian, tidak akan ditafsirkan oleh Perl seperti itu di bawah bahasa Yunani. Ini
tidak masalah disediakan Anda memastikan bahwa semua lokal akan selalu dan hanya baik
sebuah ISO8859-1, atau, jika Anda tidak memiliki pustaka C yang kurang, lokal UTF-8.
Masih masalah lain adalah bahwa pendekatan ini dapat menyebabkan dua poin kode yang berarti sama
karakter. Jadi dalam bahasa Yunani, baik U+03A7 dan U+00D7 adalah HURUF BESAR YUNANI CHI.
Karena semua masalah ini, mulai v5.22, Perl akan memunculkan peringatan jika multi-
byte (karenanya Unicode) titik kode digunakan ketika lokal byte tunggal berlaku. (Meskipun
itu tidak memeriksa ini jika melakukannya akan memperlambat eksekusi secara tidak wajar.)
Lokal vendor terkenal bermasalah, dan sulit bagi Perl untuk menguji lokalnya.
menangani kode karena ini berinteraksi dengan kode yang tidak dapat dikontrol oleh Perl; karena itu
kode penanganan lokal di Perl mungkin juga bermasalah. (Namun, Unicode-disediakan
lokal harus lebih baik, dan ada mekanisme umpan balik untuk memperbaiki masalah apa pun. Melihat
"Definisi lokal yang tersedia secara gratis".)
Jika Anda memiliki Perl v5.16, masalah yang disebutkan di atas hilang jika Anda menggunakan
":not_characters" parameter ke pragma lokal (kecuali untuk bug vendor di non-
bagian karakter). Jika Anda tidak memiliki v5.16, dan Anda do memiliki lokal yang berfungsi, menggunakan
mereka mungkin bermanfaat untuk tujuan spesifik tertentu, selama Anda mengingat
gotcha sudah disebutkan. Misalnya, jika pemeriksaan untuk lokal Anda berfungsi, itu akan berjalan
lebih cepat di bawah lokal daripada di bawah Unicode::Collate; dan Anda mendapatkan akses ke hal-hal seperti
simbol mata uang lokal dan nama bulan dan hari dalam seminggu. (Tapi untuk
utamakan intinya, di v5.16, Anda mendapatkan akses ini tanpa kerugian dari lokal dengan
menggunakan bentuk pragma ":not_characters".)
Catatan: Kebijakan penggunaan aturan lokal untuk poin kode yang dapat ditampung dalam satu byte, dan Unicode
aturan bagi yang tidak bisa tidak diterapkan secara seragam. Sebelum v5.12, itu agak
serampangan; di v5.12 itu diterapkan cukup konsisten untuk pencocokan ekspresi reguler
kecuali untuk kelas karakter yang diberi tanda kurung; di v5.14 itu diperluas ke semua kecocokan regex; dan
di v5.16 ke operasi casing seperti "\L" dan "uc()". Untuk pemeriksaan, di semua rilis
sejauh ini, fungsi "strxfrm()" sistem dipanggil, dan apa pun yang dilakukannya itulah yang Anda dapatkan.
Gunakan perlllocale online menggunakan layanan onworks.net