아니요, 그것들은 동등한 것으로 간주되지 않으며 동일한 기본 가중치를 갖습니다. 따라서 첫 번째 근사에서는 동일한 정렬입니다.
GNU 시스템 (여기서는 glibc 2.27)에서 / usr / share / i18n / locales / iso14651_t1_common (대부분의 로케일의 기준으로 사용됨)을 보면 다음과 같이 표시됩니다.
<U0065> <e>;<BAS>;<MIN>;IGNORE # 259 e
<U025B> <e>;<PCL>;<MIN>;IGNORE # 287 ɛ
<U0045> <e>;<BAS>;<CAP>;IGNORE # 577 E
e
, ɛ
및 E
동일한 기본 중량을 가질 e
와 E
같은 보조 무게 만 번째 중량 그들을 구별.
문자열을 비교할 때 sort
( strcoll()
표준 libc 함수는 문자열을 비교하는 데 사용) 모든 문자의 기본 가중치를 비교하는 것으로 시작하고 문자열이 기본 가중치와 같은 경우에만 두 번째 가중치로 이동합니다 (다른 가중치와 마찬가지로). .
첫 번째 근사에서 정렬 순서에서 대소 문자가 무시되는 것처럼 보입니다. Ab
사이의 종류 aa
및 ac
하지만 Ab
종류 전이나 후에 할 수 있습니다 ab
(일부 언어가 가지고있는 언어 규칙에 따라 <MIN>
전 <CAP>
영국 영어, 일부처럼 <CAP>
전에 <MIN>
에스토니아어처럼).
경우 e
같은 정렬 순서를 같이했다 ɛ
, printf '%s\n' e ɛ | sort -u
단 하나의 행을 반환합니다. 그러나 같은 <BAS>
종류의 이전 <PCL>
, e
혼자 종류의 전 ɛ
. eɛe
이후에 정렬 EEE
하더라도 (2 차 가중치에서) EEE
정렬 eee
합니다 (이 경우 3 번째 가중치까지 올라갑니다).
이제 glibc 2.27을 사용하는 시스템에서 다음을 실행합니다.
sed -n 's/\(.*;[^[:blank:]]*\).*/\1/p' /usr/share/i18n/locales/iso14651_t1_common |
sort -k2 | uniq -Df1
정확히 4 개의 가중치로 정의 된 문자가 꽤 있음을 알 수 있습니다. 특히, ɛ의 가중치는 다음과 같습니다.
<U01DD> <e>;<PCL>;<MIN>;IGNORE
<U0259> <e>;<PCL>;<MIN>;IGNORE
<U025B> <e>;<PCL>;<MIN>;IGNORE
그리고 충분히 :
$ printf '%s\n' $'\u01DD' $'\u0259' $'\u025B' | sort -u
ǝ
$ expr ɛ = ǝ
1
이것은 GNU libc 로켈의 버그로 볼 수 있습니다. 대부분의 다른 시스템에서 로케일은 다른 모든 문자가 결국 다른 정렬 순서를 갖도록합니다. 정렬 순서가 같은 정렬 끝나지 않는 수천 개의 문자가 있기 때문에 GNU 로케일에, 그것은 깨는처럼 (모든 종류의 문제를 일으키는, 심지어 악화 comm
, join
, ls
비 결정적 주문을 갖거나 globs와 ... 따라서 이러한 문제를 해결하기 위해 사용LC_ALL=C
하는 것이 좋습니다 .
@ninjalj가 코멘트에서 언급했듯이, 2018 년 8 월에 릴리스 된 glibc 2.28은 AFAICS를 통해 그 부분에서 약간 개선되었지만 여전히 동일한 정렬 순서로 정의 된 일부 문자 또는 조합 요소가 있습니다. glibc 2.28이 설치된 Ubuntu 18.10 및 en_GB.UTF-8 로켈에서.
$ expr $'L\ub7' = $'L\u387'
1
(U? 00B7이 L
/ l
?! 와 결합 된 경우에만 U + 0387과 동등한 것으로 간주되는 이유 ).
과:
$ perl -lC -e 'for($i=0; $i<0x110000; $i++) {$i = 0xe000 if $i == 0xd800; print chr($i)}' | sort > all-chars-sorted
$ uniq -d all-chars-sorted | wc -l
4
$ uniq -D all-chars-sorted | wc -l
1061355
(정렬 순서가 정의되지 않은 다른 문자와 동일하게 백만 자 이상의 문자 (유니 코드 범위의 95 %, 2.27에서 98 %로 줄임)).
참조 :