Une solution UCA complète
La manière la plus simple, la plus simple et la plus directe de le faire est de faire un appel au module de bibliothèque Perl, Unicode :: Collate :: Locale , qui est une sous-classe du module Unicode :: Collate standard . Tout ce que vous avez à faire est de transmettre au constructeur une valeur locale de "xv"
pour la Suède.
(Vous n'apprécierez peut-être pas nécessairement cela pour le texte suédois, mais comme Perl utilise des caractères abstraits, vous pouvez utiliser n'importe quel point de code Unicode que vous voulez - peu importe la plate-forme ou la construction! Peu de langues offrent une telle commodité. Je le mentionne parce que j'ai J'ai beaucoup perdu la bataille avec Java sur ce problème exaspérant ces derniers temps.)
Le problème est que je ne sais pas comment accéder à un module Perl à partir de Python - à part, c'est-à-dire en utilisant une légende de shell ou un tube à deux côtés. À cette fin, je vous ai donc fourni un script de travail complet appelé ucsort que vous pouvez appeler pour faire exactement ce que vous avez demandé avec une facilité parfaite.
Ce script est 100% compatible avec l' algorithme de classement Unicode complet , avec toutes les options de personnalisation prises en charge !! Et si un module optionnel est installé ou que vous exécutez Perl 5.13 ou supérieur, vous avez un accès complet aux locales CLDR faciles à utiliser. Voir ci-dessous.
Manifestation
Imaginez un ensemble d'entrée ordonné de cette façon:
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 tri par défaut par point de code donne:
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 ä å ö
ce qui est incorrect dans le livre de tout le monde. En utilisant mon script, qui utilise l'algorithme de classement Unicode, vous obtenez cet ordre:
% 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
C'est le tri UCA par défaut. Pour obtenir les paramètres régionaux suédois, appelez ucsort de cette façon:
% 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 å ä ö
Voici une meilleure démo d'entrée. Tout d'abord, l'ensemble d'entrée:
% 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
Par point de code, cela trie de cette façon:
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
Mais l'utilisation de l'UCA par défaut permet de le trier de cette façon:
% 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
Mais dans la langue suédoise, de cette façon:
% 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
Si vous préférez trier les majuscules avant les minuscules, procédez comme suit:
% 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
Sortes personnalisées
Vous pouvez faire beaucoup d'autres choses avec ucsort . Par exemple, voici comment trier les titres en anglais:
% 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
Vous aurez besoin de Perl 5.10.1 ou supérieur pour exécuter le script en général. Pour la prise en charge des paramètres régionaux, vous devez soit installer le module CPAN en option Unicode::Collate::Locale
. Vous pouvez également installer une version de développement de Perl, 5.13+, qui inclut ce module en standard.
Conventions d'appel
Il s'agit d'un prototype rapide, donc ucsort n'est généralement pas (der) documenté. Mais voici son SYNOPSIS des commutateurs / options qu'il accepte sur la ligne de commande:
# 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
Ouais, ok: c'est vraiment la liste d'arguments que j'utilise pour l'appel Getopt::Long
, mais vous voyez l'idée. :)
Si vous pouvez trouver comment appeler directement des modules de bibliothèque Perl depuis Python sans appeler un script Perl, faites-le par tous les moyens. Je ne sais pas comment faire moi-même. J'adorerais apprendre comment.
En attendant, je pense que ce script fera tout ce dont vous avez besoin dans ses particularités - et plus encore! J'utilise maintenant ceci pour tout le tri de texte. Il fait enfin ce dont j'avais besoin depuis très, très longtemps.
Le seul inconvénient est que cet --locale
argument entraîne une baisse des performances dans les tubes, bien que cela soit suffisamment rapide pour un tri régulier, non local mais toujours 100% conforme à UCA . Puisqu'il charge tout en mémoire, vous ne voudrez probablement pas l'utiliser sur des documents gigaoctets. Je l'utilise plusieurs fois par jour, et c'est vraiment génial d'avoir enfin un tri de texte sain.