완벽한 UCA 솔루션
표준 Unicode :: Collate 모듈 의 하위 클래스 인 Perl 라이브러리 모듈 Unicode :: Collate :: Locale에 대한 콜 아웃을 만드는 가장 간단하고 가장 쉽고 가장 간단한 방법 입니다. 스웨덴 에 대한 로케일 값을 생성자에 전달 하기 만하면됩니다. "xv"
(스웨덴어 텍스트에 대해서는이 기능을 꼭 사용하지 않을 수 있지만 Perl은 추상 문자를 사용하기 때문에 플랫폼이나 빌드에 관계없이 원하는 모든 유니 코드 코드 포인트를 사용할 수 있습니다. 이러한 편의를 제공하는 언어는 거의 없습니다. 최근이 미친 문제로 인해 Java와의 싸움에서 많이지고 있습니다.)
문제는 Python에서 Perl 모듈에 액세스하는 방법을 모른다는 것입니다. 즉, 쉘 콜 아웃이나 양면 파이프를 사용하는 것과는 다릅니다. 이를 위해 ucsort 라는 완전한 작업 스크립트를 제공하여 요청한 것을 완벽하게 쉽게 수행 할 수 있습니다.
이 스크립트는 전체 유니 코드 데이터 정렬 알고리즘 과 100 % 호환 되며 모든 맞춤 옵션이 지원됩니다 !! 옵션 모듈이 설치되어 있거나 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 이상이 필요합니다. 로케일 지원을 위해서는 선택적 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 준수 정렬입니다. 모든 것을 메모리에로드하기 때문에 기가 바이트 문서에 사용하고 싶지 않을 것입니다. 나는 하루에 여러 번 그것을 사용하고 마침내 정상적인 텍스트 정렬을 갖는 것이 좋습니다.