โซลูชัน UCA ที่สมบูรณ์
วิธีที่ง่ายที่สุดง่ายที่สุดและตรงไปตรงมาที่สุดในการสร้างคำบรรยายภาพไปยังโมดูลไลบรารี Perl Unicode :: Collate :: Localeซึ่งเป็นคลาสย่อยของโมดูลUnicode :: Collateมาตรฐาน สิ่งที่คุณต้องทำคือส่งตัวสร้างค่าโลแคล"xv"
สำหรับสวีเดน
(คุณอาจไม่จำเป็นต้องชื่นชมสิ่งนี้สำหรับข้อความภาษาสวีเดน แต่เนื่องจาก Perl ใช้อักขระนามธรรมคุณสามารถใช้จุดรหัส Unicode ใดก็ได้ที่คุณต้องการไม่ว่าจะเป็นแพลตฟอร์มหรือสร้างก็ตามมีภาษาไม่กี่ภาษาที่ให้ความสะดวกเช่นนี้ฉันพูดถึงเพราะฉันต่อสู้กับ สูญเสียการต่อสู้กับ Java เป็นจำนวนมากสำหรับปัญหาที่น่าสยดสยองเมื่อเร็ว ๆ นี้)
ปัญหาคือฉันไม่ทราบวิธีเข้าถึงโมดูล Perl จาก Python - นอกเหนือจากการใช้คำบรรยายภาพเชลล์หรือท่อสองด้าน ด้วยเหตุนี้ฉันจึงได้จัดเตรียมสคริปต์การทำงานที่เรียกว่าucsortที่คุณสามารถเรียกใช้เพื่อทำสิ่งที่คุณขอได้อย่างง่ายดาย
สคริปต์นี้สอดคล้อง 100% กับUnicode Collation Algorithmแบบเต็มตัวเลือกการปรับแต่งทั้งหมดที่รองรับ !! และหากคุณติดตั้งโมดูลเสริมหรือรัน 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 Collation Algorithm คุณจะได้รับคำสั่งนี้:
% 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 ตัวอย่างเช่นวิธีจัดเรียงชื่อเรื่องในภาษาอังกฤษมีดังนี้
% 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 หรือดีกว่าเพื่อเรียกใช้สคริปต์โดยทั่วไป Unicode::Collate::Locale
สำหรับการสนับสนุนสถานที่คุณอาจต้องติดตั้งโมดูล CPAN ตัวเลือก หรือคุณสามารถติดตั้ง Perl เวอร์ชันพัฒนา 5.13+ ซึ่งรวมถึงโมดูลนั้นได้ตามมาตรฐาน
การเรียกประชุม
นี่คือต้นแบบที่รวดเร็วดังนั้นucsortส่วนใหญ่จึงมีการจัดทำเป็นเอกสาร แต่นี่คือ SYNOPSIS ของสวิตช์ / ตัวเลือกที่ยอมรับในบรรทัดคำสั่ง:
--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
ใช่ตกลง: นั่นคือรายการอาร์กิวเมนต์ที่ฉันใช้สำหรับการโทรหาGetopt::Long
แต่คุณเข้าใจแล้ว :)
หากคุณสามารถหาวิธีเรียกโมดูลไลบรารี Perl จาก Python ได้โดยตรงโดยไม่ต้องเรียกสคริปต์ Perl ให้ทำเช่นนั้น ฉันไม่รู้ว่าตัวเองเป็นอย่างไร ฉันชอบที่จะเรียนรู้วิธีการ
ในระหว่างนี้ฉันเชื่อว่าสคริปต์นี้จะทำในสิ่งที่คุณต้องทำโดยเฉพาะ - และอื่น ๆ อีกมากมาย! ตอนนี้ฉันใช้สิ่งนี้สำหรับการจัดเรียงข้อความทั้งหมด ในที่สุดมันก็ทำในสิ่งที่ฉันต้องการมานานและยาวนาน
ข้อเสียเพียงอย่างเดียวคือ--locale
อาร์กิวเมนต์ทำให้ประสิทธิภาพลดลงแม้ว่าจะเร็วพอสำหรับการเรียงลำดับปกติที่ไม่ใช่ภาษาแต่ก็ยังคงเป็นไปตามมาตรฐาน UCA 100% เนื่องจากโหลดทุกอย่างในหน่วยความจำคุณอาจไม่ต้องการใช้สิ่งนี้กับเอกสารกิกะไบต์ ฉันใช้มันหลายครั้งต่อวันและแน่ใจว่าการเรียงลำดับข้อความที่ดีในที่สุด