Повне рішення UCA
Найпростіший, найпростіший і найпростіший спосіб зробити це, щоб зробити опис до бібліотечного модуля Perl, Unicode :: Collate :: Locale , що є підкласом стандартного модуля Unicode :: Collate . Все, що вам потрібно зробити - це передати конструктору значення локального значення "xv"
для Швеції.
(Ви можете не обов'язково оцінювати це для шведського тексту, але оскільки Perl використовує абстрактні символи, ви можете використовувати будь-яку точку коду Unicode, будь ласка, незалежно від платформи чи побудови! Мало хто з мов пропонує таку зручність. Я згадую це, тому що я борюся з останнім часом сильно програв битву з Java через цю божевільну проблему.)
Проблема полягає в тому, що я не знаю, як отримати доступ до модуля Perl від Python - крім того, тобто за допомогою опису оболонки або двосторонньої труби. З цією метою я запропонував вам повний робочий сценарій під назвою ucsort, який ви можете закликати робити саме те, про що ви просили, з легкістю.
Цей сценарій на 100% відповідає повному алгоритму зібрання Unicode , підтримуються всі варіанти пошиття !! І якщо у вас встановлений додатковий модуль або запущений Perl 5.13 або вище, ви маєте повний доступ до простих у користуванні локальних знаків CLDR. Дивись нижче.
Демонстрація
Уявіть, що набір входів упорядкований таким чином:
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
Сортування за замовчуванням за кодовою точкою дає:
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 ä å ö
що невірно в усіх книгах. Використовуючи мій сценарій, в якому використовується алгоритм зібрання Unicode, ви отримуєте таке замовлення:
% 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
Це сортування за замовчуванням UCA. Щоб отримати шведський локал , телефонуйте ucsort таким чином:
% 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 å ä ö
Ось краща демонстраційна версія. Спочатку набір вводу:
% 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
За точкою коду, це сортує так:
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
Але використання UCA за замовчуванням робить його таким чином:
% 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
Але у шведській мові так:
% 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
Якщо ви віддаєте перевагу великим регістром для сортування перед малі, зробіть це:
% 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
Індивідуальні сорти
Ви можете зробити багато інших речей з укротом . Наприклад, ось як сортувати заголовки англійською мовою:
% 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
Вам знадобиться Perl 5.10.1 або краще для запуску сценарію в цілому. Для підтримки локальної служби необхідно встановити додатковий модуль CPAN Unicode::Collate::Locale
. Крім того, ви можете встановити версії розробки Perl, 5.13+, які стандартно включають цей модуль.
Закликання до конвенцій
Це швидкий прототип, тому ucsort здебільшого не (дер) задокументований. Але це його СИНОПИС того, які комутатори / параметри він приймає в командному рядку:
# 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
Так, добре: це справді список аргументів, який я використовую для дзвінка Getopt::Long
, але ви зрозумієте, що це. :)
Якщо ви можете зрозуміти, як викликати модулі бібліотеки Perl з Python безпосередньо, не викликаючи скрипт Perl, будь-ласка, зробіть це. Я просто не знаю як себе. Я хотів би навчитися, як.
Тим часом, я вірю, що цей сценарій зробить все, що вам потрібно зробити, в усьому його конкретному - і багато іншого! Зараз я використовую це для всього сортування тексту. Це, нарешті, робить те, що мені було потрібно довгий-довгий час.
Єдиним недоліком є те, що --locale
аргумент призводить до зниження продуктивності труб, хоча він достатньо швидкий для звичайного, не локального, але все-таки 100% сумісного з UCA сортування. Оскільки він завантажує все в пам'ять, ви, ймовірно, не хочете використовувати це в гігабайтних документах. Я використовую його багато разів на день, і він впевнений, що це чудово, маючи нарешті здорове сортування тексту.