Una soluzione UCA completa
Il modo più semplice, facile e diretto per farlo è fare un richiamo al modulo della libreria Perl, Unicode :: Collate :: Locale , che è una sottoclasse del modulo Unicode :: Collate standard. Tutto quello che devi fare è passare al costruttore un valore locale di "xv"
per la Svezia.
(Potresti non apprezzarlo necessariamente per il testo svedese, ma poiché Perl usa caratteri astratti, puoi usare qualsiasi punto di codice Unicode che desideri, indipendentemente dalla piattaforma o dalla build! Poche lingue offrono tale comodità. Lo menziono perché ho combattuto un ultimamente ha perso molte battaglie con Java per questo problema esasperante.)
Il problema è che non so come accedere a un modulo Perl da Python, a parte, cioè, dall'utilizzo di un callout della shell o di una pipe a due lati. A tal fine, ti ho quindi fornito uno script funzionante completo chiamato ucsort che puoi chiamare per fare esattamente ciò che hai richiesto con perfetta facilità.
Questo script è compatibile al 100% con l' algoritmo di confronto Unicode completo , con tutte le opzioni di personalizzazione supportate !! E se si dispone di un modulo opzionale installato o si esegue Perl 5.13 o superiore, si ha pieno accesso alle versioni locali CLDR di facile utilizzo. Vedi sotto.
Dimostrazione
Immagina un set di input ordinato in questo modo:
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
Un ordinamento predefinito per punto di codice restituisce:
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 ä å ö
che non è corretto dal libro di tutti. Usando il mio script, che utilizza l'algoritmo di confronto Unicode, ottieni questo ordine:
% 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
Questo è l'ordinamento UCA predefinito. Per ottenere la lingua svedese, chiama ucsort in questo modo:
% 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 å ä ö
Ecco una demo di input migliore. Innanzitutto, il set di 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
Per punto di codice, ordina in questo modo:
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
Ma l'utilizzo dell'UCA predefinito consente di ordinare in questo modo:
% 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
Ma nella lingua svedese, in questo modo:
% 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
Se preferisci ordinare le maiuscole prima delle minuscole, fai questo:
% 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
Ordinamenti personalizzati
Puoi fare molte altre cose con ucsort . Ad esempio, ecco come ordinare i titoli in inglese:
% 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
Avrai bisogno di Perl 5.10.1 o superiore per eseguire lo script in generale. Per il supporto locale, è necessario installare il modulo CPAN opzionale Unicode::Collate::Locale
. In alternativa, puoi installare una versione di sviluppo di Perl, 5.13+, che include quel modulo in modo standard.
Convenzioni di chiamata
Questo è un prototipo rapido, quindi ucsort è per lo più sotto (der) documentato. Ma questa è la sua SINOSSI di quali opzioni / opzioni accetta sulla riga di comando:
# 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
Sì, ok: questo è davvero l'elenco degli argomenti che uso per la chiamata a Getopt::Long
, ma hai capito. :)
Se riesci a capire come chiamare i moduli della libreria Perl da Python direttamente senza chiamare uno script Perl, fallo in ogni caso. Non so proprio come fare. Mi piacerebbe imparare come.
Nel frattempo, credo che questo script farà ciò di cui hai bisogno in tutti i suoi particolari e anche di più! Ora lo uso per tutto l'ordinamento del testo. E , infine, fa quello che ho bisogno per un lungo, lungo tempo.
L'unico svantaggio è che l' --locale
argomento fa sì che le prestazioni vadano giù per i tubi, sebbene sia abbastanza veloce per l' ordinamento regolare, non locale ma ancora conforme al 100% UCA . Dato che carica tutto in memoria, probabilmente non vorrai usarlo su documenti gigabyte. Lo uso molte volte al giorno, e finalmente è fantastico avere un ordinamento di testo sano.