Một giải pháp UCA hoàn chỉnh
Cách đơn giản nhất, dễ nhất và đơn giản nhất để thực hiện việc này là tạo chú thích cho mô-đun thư viện Perl, Unicode :: Collate :: Locale , là một lớp con của mô-đun Unicode :: Collate tiêu chuẩn . Tất cả những gì bạn cần làm là chuyển cho hàm tạo một giá trị ngôn ngữ của "xv"
Thụy Điển.
(Bạn có thể không đánh giá cao điều này đối với văn bản tiếng Thụy Điển, nhưng vì Perl sử dụng các ký tự trừu tượng, bạn có thể sử dụng bất kỳ điểm mã Unicode nào mà bạn muốn - bất kể nền tảng hoặc phiên bản! Rất ít ngôn ngữ mang lại sự tiện lợi như vậy. Tôi đề cập đến điều đó vì tôi đã chiến đấu với gần đây đã thua trận với Java rất nhiều vì vấn đề khó chịu này.)
Vấn đề là tôi không biết cách truy cập mô-đun Perl từ Python - ngoài việc sử dụng chú thích shell hoặc đường ống hai cạnh. Vì vậy , tôi đã cung cấp cho bạn một tập lệnh làm việc hoàn chỉnh được gọi là ucsort mà bạn có thể gọi để thực hiện chính xác những gì bạn đã yêu cầu một cách hoàn toàn dễ dàng.
Tập lệnh này tuân thủ 100% với Thuật toán đối chiếu Unicode đầy đủ , với tất cả các tùy chọn chỉnh sửa được hỗ trợ !! Và nếu bạn đã cài đặt mô-đun tùy chọn hoặc chạy Perl 5.13 trở lên, thì bạn có toàn quyền truy cập vào các ngôn ngữ CLDR dễ sử dụng. Xem bên dưới.
Trình diễn
Hãy tưởng tượng một tập hợp đầu vào được sắp xếp theo cách này:
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
Sắp xếp mặc định theo điểm mã mang lại:
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 ä å ö
mà sách của mọi người không chính xác. Sử dụng tập lệnh của tôi, sử dụng Thuật toán đối chiếu Unicode, bạn nhận được thứ tự sau:
% 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
Đó là kiểu UCA mặc định. Để nhận ngôn ngữ Thụy Điển, hãy gọi ucsort theo cách này:
% 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 å ä ö
Đây là một bản demo đầu vào tốt hơn. Đầu tiên, bộ đầu vào:
% 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
Theo điểm mã, sắp xếp theo cách này:
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
Nhưng việc sử dụng UCA mặc định làm cho nó sắp xếp theo cách này:
% 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
Nhưng trong ngôn ngữ Thụy Điển, theo cách này:
% 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
Nếu bạn muốn sắp xếp chữ hoa trước chữ thường, hãy làm như sau:
% 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
Các loại tùy chỉnh
Bạn có thể làm nhiều việc khác với ucsort . Ví dụ, đây là cách sắp xếp tiêu đề bằng tiếng Anh:
% 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
Bạn sẽ cần Perl 5.10.1 hoặc cao hơn để chạy tập lệnh nói chung. Để được hỗ trợ ngôn ngữ, bạn phải cài đặt mô-đun CPAN tùy chọn Unicode::Collate::Locale
. Ngoài ra, bạn có thể cài đặt phiên bản phát triển của Perl, 5.13+, bao gồm mô-đun đó theo tiêu chuẩn.
Quy ước gọi điện
Đây là một nguyên mẫu nhanh, vì vậy ucsort hầu như không được ghi lại bằng tài liệu. Nhưng đây là TỔNG HỢP của nó về những gì nó chấp nhận chuyển đổi / tùy chọn trên dòng lệnh:
# 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
Yeah, ok: đó thực sự là danh sách đối số mà tôi sử dụng cho cuộc gọi đến Getopt::Long
, nhưng bạn hiểu rồi đấy. :)
Nếu bạn có thể tìm ra cách gọi trực tiếp các mô-đun thư viện Perl từ Python mà không cần gọi tập lệnh Perl, thì hãy làm như vậy. Tôi chỉ không biết bản thân mình như thế nào. Tôi muốn tìm hiểu cách làm.
Trong thời gian chờ đợi, tôi tin rằng tập lệnh này sẽ làm được những gì bạn cần làm trong tất cả những gì cụ thể của nó - và hơn thế nữa! Bây giờ tôi sử dụng cái này cho tất cả việc sắp xếp văn bản. Cuối cùng nó cũng làm được những gì tôi cần trong một thời gian dài.
Nhược điểm duy nhất là --locale
lập luận này khiến hiệu suất của các ống giảm xuống, mặc dù nó đủ nhanh để phân loại thông thường, không theo ngôn ngữ nhưng vẫn tuân thủ 100% UCA . Vì nó tải mọi thứ trong bộ nhớ, bạn có thể không muốn sử dụng nó trên các tài liệu gigabyte. Tôi sử dụng nó nhiều lần trong ngày và chắc chắn rằng cuối cùng nó rất tuyệt vời khi sắp xếp văn bản lành mạnh.