Kompletne rozwiązanie UCA
Najprostszym, najłatwiejszym i najprostszym sposobem wykonania tego jest wywołanie modułu biblioteki Perl, Unicode :: Collate :: Locale , który jest podklasą standardowego modułu Unicode :: Collate . Wszystko, co musisz zrobić, to przekazać konstruktorowi wartość locale "xv"
dla Szwecji.
(Być może niekoniecznie doceniasz to w szwedzkim tekście, ale ponieważ Perl używa abstrakcyjnych znaków, możesz użyć dowolnego punktu kodu Unicode, który Ci się podoba - bez względu na platformę lub wersję! Niewiele języków oferuje taką wygodę. Wspominam o tym, ponieważ walczę z ostatnio przegrywała bitwę z Javą z powodu tego irytującego problemu.)
Problem polega na tym, że nie wiem, jak uzyskać dostęp do modułu Perla z Pythona - pomijając, to znaczy używając wywołania powłoki lub dwustronnego potoku. W tym celu dostarczyłem ci zatem kompletny skrypt roboczy zwany ucsort , który możesz wywołać, aby zrobić dokładnie to, o co prosiłeś, z doskonałą łatwością.
Ten skrypt jest w 100% zgodny z pełnym algorytmem sortowania Unicode , z obsługą wszystkich opcji dostosowywania !! A jeśli masz zainstalowany opcjonalny moduł lub korzystasz z Perla 5.13 lub nowszego, masz pełny dostęp do łatwych w użyciu ustawień regionalnych CLDR. Zobacz poniżej.
Demonstracja
Wyobraź sobie zestaw wejściowy uporządkowany w ten sposób:
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
Domyślne sortowanie według punktu kodowego daje:
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 ä å ö
co jest błędne w książce wszystkich. Korzystając z mojego skryptu, który używa algorytmu sortowania Unicode, otrzymujesz następującą kolejność:
% 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
To jest domyślne sortowanie UCA. Aby uzyskać szwedzkie ustawienie regionalne, zadzwoń do ucsort w ten sposób:
% 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 å ä ö
Oto lepsze demo wejścia. Najpierw zestaw wejściowy:
% 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
Według punktu kodowego, to sortuje w ten sposób:
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
Ale użycie domyślnego UCA powoduje sortowanie w ten sposób:
% 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
Ale w szwedzkim lokalu tak:
% 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
Jeśli wolisz sortować wielkie litery przed małymi, zrób to:
% 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
Niestandardowe rodzaje
Możesz zrobić wiele innych rzeczy za pomocą ucsort . Na przykład, oto jak sortować tytuły w języku angielskim:
% 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
Do uruchomienia skryptu będziesz potrzebować Perla 5.10.1 lub nowszego. Aby zapewnić obsługę ustawień regionalnych, należy albo zainstalować opcjonalny moduł CPAN Unicode::Collate::Locale
. Alternatywnie możesz zainstalować wersje rozwojowe Perla, 5.13+, które standardowo zawierają ten moduł.
Konwencje telefoniczne
Jest to szybki prototyp, więc ucsort jest przeważnie nieudokumentowany. Ale to jest jego SKŁADNIA tego, jakie przełączniki / opcje akceptuje w wierszu poleceń:
# 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
Tak, ok: to naprawdę lista argumentów, której używam w wywołaniu Getopt::Long
, ale masz pomysł. :)
Jeśli potrafisz dowiedzieć się, jak wywołać moduły biblioteki Perla bezpośrednio z Pythona bez wywoływania skryptu Perla, zrób to. Po prostu nie wiem, jak ja. Chciałbym się dowiedzieć, jak to zrobić.
W międzyczasie uważam, że ten skrypt zrobi to, czego potrzebujesz w każdym szczególe - a nawet więcej! Teraz używam tego do sortowania całego tekstu. W końcu robi to, czego potrzebowałem przez długi, długi czas.
Jedynym minusem jest to, że --locale
argument powoduje spadek wydajności, chociaż jest wystarczająco szybki do regularnego, nielokalnego, ale nadal w 100% zgodnego z UCA sortowania. Ponieważ ładuje wszystko w pamięci, prawdopodobnie nie chcesz używać tego w dokumentach gigabajtowych. Używam go wiele razy dziennie i na pewno świetnie jest mieć wreszcie rozsądne sortowanie tekstu.