Eine vollständige UCA-Lösung
Die einfachste, einfachste und einfachste Möglichkeit, dies zu tun, besteht darin, ein Callout für das Perl-Bibliotheksmodul Unicode :: Collate :: Locale zu erstellen , das eine Unterklasse des Standardmoduls Unicode :: Collate ist . Sie müssen dem Konstruktor lediglich einen Gebietsschemawert "xv"
für Schweden übergeben.
(Sie werden dies vielleicht nicht unbedingt für schwedischen Text zu schätzen wissen, aber da Perl abstrakte Zeichen verwendet, können Sie jeden beliebigen Unicode-Codepunkt verwenden - unabhängig von der Plattform oder dem Build! Nur wenige Sprachen bieten einen solchen Komfort. Ich erwähne es, weil ich gegen a gekämpft habe Ich habe in letzter Zeit viel mit Java wegen dieses verrückten Problems verloren.)
Das Problem ist, dass ich nicht weiß, wie ich von Python aus auf ein Perl-Modul zugreifen soll - abgesehen von der Verwendung eines Shell-Callouts oder einer zweiseitigen Pipe. Zu diesem Zweck habe ich Ihnen daher ein vollständiges Arbeitsskript namens ucsort zur Verfügung gestellt , das Sie aufrufen können, um genau das zu tun, wonach Sie gefragt haben.
Dieses Skript ist zu 100% mit dem vollständigen Unicode-Kollatierungsalgorithmus kompatibel , wobei alle Anpassungsoptionen unterstützt werden !! Wenn Sie ein optionales Modul installiert haben oder Perl 5.13 oder besser ausführen, haben Sie vollen Zugriff auf benutzerfreundliche CLDR-Gebietsschemas. Siehe unten.
Demonstration
Stellen Sie sich einen Eingabesatz vor, der folgendermaßen angeordnet ist:
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
Eine Standard-Sortierung nach Codepunkt ergibt:
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 ä å ö
Das ist falsch in jedermanns Buch. Mit meinem Skript, das den Unicode-Kollatierungsalgorithmus verwendet, erhalten Sie folgende Reihenfolge:
% 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
Dies ist die Standard-UCA-Sortierung. Um das schwedische Gebietsschema zu erhalten, rufen Sie ucsort folgendermaßen auf :
% 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 å ä ö
Hier ist eine bessere Eingabedemo. Zunächst der Eingabesatz:
% 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
Nach Codepunkt sortiert das folgendermaßen:
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
Bei Verwendung der Standard-UCA wird dies jedoch folgendermaßen sortiert:
% 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
Aber im schwedischen Gebietsschema so:
% 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
Wenn Sie es vorziehen, Großbuchstaben vor Kleinbuchstaben zu sortieren, gehen Sie folgendermaßen vor:
% 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
Kundenspezifische Sorten
Mit ucsort können Sie viele andere Dinge tun . So sortieren Sie beispielsweise Titel auf Englisch:
% 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
Sie benötigen Perl 5.10.1 oder besser, um das Skript im Allgemeinen auszuführen. Für die Unterstützung des Gebietsschemas müssen Sie entweder das optionale CPAN-Modul installieren Unicode::Collate::Locale
. Alternativ können Sie eine Entwicklungsversion von Perl 5.13+ installieren, die dieses Modul standardmäßig enthält.
Konventionen aufrufen
Dies ist ein schneller Prototyp, daher ist ucsort größtenteils nicht (der) dokumentiert. Dies ist jedoch die ÜBERSICHT darüber, welche Schalter / Optionen in der Befehlszeile akzeptiert werden:
# 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
Ja, ok: Das ist wirklich die Argumentliste, die ich für den Anruf verwende Getopt::Long
, aber Sie haben die Idee. :) :)
Wenn Sie herausfinden können, wie Sie Perl-Bibliotheksmodule direkt aus Python aufrufen können, ohne ein Perl-Skript aufzurufen, tun Sie dies auf jeden Fall. Ich weiß nur nicht wie ich. Ich würde gerne lernen wie.
In der Zwischenzeit glaube ich, dass dieses Skript genau das tun wird, was Sie brauchen - und noch mehr! Ich benutze dies jetzt für die gesamte Textsortierung. Es macht endlich das, was ich für eine lange, lange Zeit gebraucht habe.
Der einzige Nachteil ist, dass das --locale
Argument dazu führt, dass die Leistung in die Hose geht, obwohl es schnell genug für eine reguläre, nicht lokale, aber dennoch 100% UCA-konforme Sortierung ist. Da alles in den Speicher geladen wird, möchten Sie dies wahrscheinlich nicht für Gigabyte-Dokumente verwenden. Ich benutze es oft am Tag und es ist sicher großartig, endlich eine vernünftige Textsortierung zu haben.