Eksiksiz bir UCA Çözümü
Bunu yapmanın en basit, en kolay ve en basit yolu , standart Unicode :: Collate modülünün bir alt sınıfı olan Perl kitaplık modülü olan Unicode :: Collate :: Locale'ye bir açıklama yapmaktır . Yapmanız gereken tek şey, kurucuya İsveç için bir yerel değer iletmek . "xv"
(İsveççe metin için bunu takdir etmeyebilirsiniz, ancak Perl soyut karakterler kullandığı için, istediğiniz herhangi bir Unicode kod noktasını kullanabilirsiniz - platform veya yapı ne olursa olsun! Çok az dil böyle bir kolaylık sunar. Son zamanlarda bu çıldırtıcı problem yüzünden Java ile savaşı çok kaybetti.)
Sorun şu ki, Python'dan bir Perl modülüne nasıl erişeceğimi bilmiyorum - yani, kabuk belirtme çizgisi veya iki taraflı boru kullanmak dışında. Bu amaçla, tam olarak istediğiniz şeyi mükemmel bir kolaylıkla yapmak için arayabileceğiniz, ucsort adında eksiksiz bir çalışma betiği sağladım .
Bu komut dosyası, tüm özelleştirme seçeneklerinin desteklendiği tam Unicode Harmanlama Algoritması ile% 100 uyumludur !! Ve isteğe bağlı bir modül taktıysanız veya Perl 5.13 veya daha üstünü çalıştırıyorsanız, kullanımı kolay CLDR yerel ayarlarına tam erişiminiz olur. Aşağıya bakınız.
Gösteri
Bu şekilde sıralanmış bir girdi kümesi düşünün:
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
Kod noktasına göre varsayılan bir sıralama şunu verir:
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 ä å ö
bu herkesin kitabına göre yanlıştır. Unicode Harmanlama Algoritmasını kullanan betiğimi kullanarak şu sırayı alırsınız:
% 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
Bu, varsayılan UCA sıralamasıdır. İsveç yerel ayarını almak için ucsort'u şu şekilde arayın :
% 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 å ä ö
İşte daha iyi bir girdi demosu. İlk olarak, giriş kümesi:
% 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
Kod noktasına göre, bu şu şekilde sıralanır:
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
Ancak varsayılan UCA'yı kullanmak, bu şekilde sıralamayı sağlar:
% 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
Ancak İsveç dilinde şu şekilde:
% 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
Büyük harfin küçük harften önce sıralanmasını tercih ediyorsanız, şunu yapın:
% 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
Özelleştirilmiş Türler
Ucsort ile daha birçok şey yapabilirsiniz . Örneğin, İngilizce başlıkları şu şekilde sıralayabilirsiniz:
% 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
Komut dosyasını genel olarak çalıştırmak için Perl 5.10.1 veya daha iyisine ihtiyacınız olacak. Yerel ayar desteği için isteğe bağlı CPAN modülünü kurmanız gerekir Unicode::Collate::Locale
. Alternatif olarak, bu modülü standart olarak içeren Perl, 5.13+ geliştirme sürümlerini kurabilirsiniz.
Çağrı Kuralları
Bu hızlı bir prototiptir, bu nedenle ucsort çoğunlukla belgelenmemiştir. Ancak bu, komut satırında kabul ettiği anahtarların / seçeneklerin SYNOPSIS'idir:
--help|?
--man|m
--debug|d
--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
--case-insensitive|insensitive|i
--input-encoding|e=s
--locale|L=s
--paragraph|p
--reverse-fields|last
--reverse-output|r
--right-to-left|reverse-input
Evet, tamam: bu gerçekten arama için kullandığım argüman listesi Getopt::Long
, ama sen anladın. :)
Bir Perl betiği çağırmadan doğrudan Python'dan Perl kütüphane modüllerini nasıl çağıracağınızı çözebiliyorsanız, kesinlikle yapın. Sadece kendimi nasıl bilemiyorum. Nasıl olduğunu öğrenmek isterim.
Bu arada, bu senaryonun tüm özelliğiyle ihtiyacınız olan şeyi ve daha fazlasını yapacağına inanıyorum ! Şimdi bunu tüm metin sıralama için kullanıyorum. Bu nihayet ben uzun, çok uzun zamandır ihtiyaç duyulan kadarıyla yok.
Tek dezavantajı, --locale
argümanın performansın düşük olmasına neden olmasıdır, ancak normal, yerel olmayan ancak yine de% 100 UCA uyumlu sıralama için yeterince hızlıdır . Her şeyi belleğe yüklediği için, muhtemelen bunu gigabaytlık belgelerde kullanmak istemezsiniz. Günde birçok kez kullanıyorum ve sonunda aklı başında metin sıralaması yapmak harika.