Solusi UCA Lengkap
Cara termudah, termudah, dan paling mudah untuk melakukannya adalah dengan membuat panggilan ke modul perpustakaan Perl, Unicode :: Collate :: Locale , yang merupakan subkelas dari modul Unicode :: Collate standar . Yang perlu Anda lakukan adalah meneruskan konstruktor dengan nilai lokal "xv"
untuk Swedia.
(Anda mungkin tidak perlu menghargai ini untuk teks bahasa Swedia, tetapi karena Perl menggunakan karakter abstrak, Anda dapat menggunakan titik kode Unicode apa pun sesuka Anda - tidak peduli platform atau build! Beberapa bahasa menawarkan kemudahan seperti itu. Saya menyebutkannya karena saya telah melawan kalah dalam pertempuran dengan Java karena masalah yang menjengkelkan akhir-akhir ini.)
Masalahnya adalah saya tidak tahu bagaimana mengakses modul Perl dari Python - selain itu, dari menggunakan shell callout atau pipa dua sisi. Untuk itu, oleh karena itu saya telah memberi Anda skrip kerja lengkap yang disebut ucsort yang dapat Anda panggil untuk melakukan apa yang Anda minta dengan mudah.
Skrip ini 100% sesuai dengan Algoritma Penyatuan Unicode lengkap , dengan semua opsi penyesuaian yang didukung !! Dan jika Anda memiliki modul opsional yang diinstal atau menjalankan Perl 5.13 atau yang lebih baik, Anda memiliki akses penuh ke lokal CLDR yang mudah digunakan. Lihat di bawah.
Demonstrasi
Bayangkan satu set input yang diurutkan dengan cara ini:
b o i j n l m å y e v s k h d f g t ö r x p z a ä c u q
Urutan default berdasarkan hasil poin kode:
a b c d e f g h i j k l m n o p q r s t u v x y z ä å ö
yang tidak benar oleh buku semua orang. Menggunakan skrip saya, yang menggunakan Unicode Collation Algorithm, Anda mendapatkan urutan ini:
% perl ucsort /tmp/swedish_alphabet | fmt
a å ä b c d e f g h i j k l m n o ö p q r s t u v x y z
Itu adalah jenis UCA default. Untuk mendapatkan lokal Swedia, panggil ucsort dengan cara ini:
% perl ucsort --locale=sv /tmp/swedish_alphabet | fmt
a b c d e f g h i j k l m n o p q r s t u v x y z å ä ö
Ini adalah demo masukan yang lebih baik. Pertama, set input:
% fmt /tmp/swedish_set
cTD cDD Cöd Cbd cAD cCD cYD Cud cZD Cod cBD Cnd cQD cFD Ced Cfd cOD
cLD cXD Cid Cpd cID Cgd cVD cMD cÅD cGD Cqd Cäd cJD Cdd Ckd cÖD cÄD
Ctd Czd Cxd cHD cND cKD Cvd Chd Cyd cUD Cld Cmd cED Crd Cad Cåd Ccd
cRD cSD Csd Cjd cPD
Menurut kode poin, seperti ini:
Cad Cbd Ccd Cdd Ced Cfd Cgd Chd Cid Cjd Ckd Cld Cmd Cnd Cod Cpd Cqd
Crd Csd Ctd Cud Cvd Cxd Cyd Czd Cäd Cåd Cöd cAD cBD cCD cDD cED cFD
cGD cHD cID cJD cKD cLD cMD cND cOD cPD cQD cRD cSD cTD cUD cVD cXD
cYD cZD cÄD cÅD cÖD
Tetapi menggunakan UCA default membuatnya seperti ini:
% ucsort /tmp/swedish_set | fmt
cAD Cad cÅD Cåd cÄD Cäd cBD Cbd cCD Ccd cDD Cdd cED Ced cFD Cfd cGD
Cgd cHD Chd cID Cid cJD Cjd cKD Ckd cLD Cld cMD Cmd cND Cnd cOD Cod
cÖD Cöd cPD Cpd cQD Cqd cRD Crd cSD Csd cTD Ctd cUD Cud cVD Cvd cXD
Cxd cYD Cyd cZD Czd
Namun dalam bahasa Swedia, begini:
% ucsort --locale=sv /tmp/swedish_set | fmt
cAD Cad cBD Cbd cCD Ccd cDD Cdd cED Ced cFD Cfd cGD Cgd cHD Chd cID
Cid cJD Cjd cKD Ckd cLD Cld cMD Cmd cND Cnd cOD Cod cPD Cpd cQD Cqd
cRD Crd cSD Csd cTD Ctd cUD Cud cVD Cvd cXD Cxd cYD Cyd cZD Czd cÅD
Cåd cÄD Cäd cÖD Cöd
Jika Anda lebih suka mengurutkan huruf besar sebelum huruf kecil, lakukan ini:
% ucsort --upper-before-lower --locale=sv /tmp/swedish_set | fmt
Cad cAD Cbd cBD Ccd cCD Cdd cDD Ced cED Cfd cFD Cgd cGD Chd cHD Cid
cID Cjd cJD Ckd cKD Cld cLD Cmd cMD Cnd cND Cod cOD Cpd cPD Cqd cQD
Crd cRD Csd cSD Ctd cTD Cud cUD Cvd cVD Cxd cXD Cyd cYD Czd cZD Cåd
cÅD Cäd cÄD Cöd cÖD
Macam Disesuaikan
Anda dapat melakukan banyak hal lain dengan ucsort . Misalnya, berikut cara mengurutkan judul dalam bahasa Inggris:
% ucsort --preprocess='s/^(an?|the)\s+//i' /tmp/titles
Anathem
The Book of Skulls
A Civil Campaign
The Claw of the Conciliator
The Demolished Man
Dune
An Early Dawn
The Faded Sun: Kesrith
The Fall of Hyperion
A Feast for Crows
Flowers for Algernon
The Forbidden Tower
Foundation and Empire
Foundation’s Edge
The Goblin Reservation
The High Crusade
Jack of Shadows
The Man in the High Castle
The Ringworld Engineers
The Robots of Dawn
A Storm of Swords
Stranger in a Strange Land
There Will Be Time
The White Dragon
Anda membutuhkan Perl 5.10.1 atau yang lebih baik untuk menjalankan skrip secara umum. Untuk dukungan lokal, Anda harus memasang modul CPAN opsional Unicode::Collate::Locale
. Sebagai alternatif, Anda dapat menginstal versi pengembangan Perl, 5.13+, yang menyertakan modul itu secara standar.
Konvensi Panggilan
Ini adalah prototipe cepat, jadi ucsort sebagian besar tidak didokumentasikan. Tetapi ini adalah SINOPSIS dari switch / opsi apa yang diterimanya pada baris perintah:
# standard options
--help|?
--man|m
--debug|d
# collator constructor options
--backwards-levels=i
--collation-level|level|l=i
--katakana-before-hiragana
--normalization|n=s
--override-CJK=s
--override-Hangul=s
--preprocess|P=s
--upper-before-lower|u
--variable=s
# program specific options
--case-insensitive|insensitive|i
--input-encoding|e=s
--locale|L=s
--paragraph|p
--reverse-fields|last
--reverse-output|r
--right-to-left|reverse-input
Ya, ok: itu benar-benar daftar argumen yang saya gunakan untuk panggilan Getopt::Long
, tetapi Anda mengerti. :)
Jika Anda dapat mengetahui cara memanggil modul pustaka Perl dari Python secara langsung tanpa memanggil skrip Perl, lakukanlah. Saya hanya tidak tahu bagaimana diri saya sendiri. Saya ingin mempelajari caranya.
Sementara itu, saya yakin skrip ini akan melakukan apa yang perlu Anda lakukan secara khusus - dan banyak lagi! Saya sekarang menggunakan ini untuk semua penyortiran teks. Itu akhirnya melakukan apa yang saya butuhkan untuk waktu yang sangat, sangat lama.
Satu-satunya downside adalah bahwa --locale
argumen menyebabkan kinerja turun tabung, meskipun cukup cepat untuk penyortiran reguler, non-lokal tetapi masih 100% sesuai UCA . Karena memuat semua yang ada di memori, Anda mungkin tidak ingin menggunakan ini pada dokumen gigabyte. Saya menggunakannya berkali-kali sehari, dan itu pasti bagus karena akhirnya teks yang masuk akal.