No, non li considera equivalenti, hanno solo lo stesso peso primario. In modo che, in prima approssimazione, ordinino lo stesso.
Se guardi / usr / share / i18n / locales / iso14651_t1_common (usato come base per la maggior parte delle versioni locali) su un sistema GNU (qui con glibc 2.27), vedrai:
<U0065> <e>;<BAS>;<MIN>;IGNORE # 259 e
<U025B> <e>;<PCL>;<MIN>;IGNORE # 287 ɛ
<U0045> <e>;<BAS>;<CAP>;IGNORE # 577 E
e
, ɛ
E E
hanno lo stesso peso primario, e
e E
lo stesso peso secondario, solo il terzo peso li differenzia.
Quando si confrontano le stringhe, sort
(la strcoll()
funzione libc standard viene utilizzata per confrontare le stringhe) inizia confrontando i pesi primari di tutti i caratteri e si procede al secondo peso solo se le stringhe sono uguali ai pesi primari (e così via con gli altri pesi) .
Ecco come il caso sembra essere ignorato nell'ordinamento in prima approssimazione. Ab
ordina tra aa
e ac
, ma Ab
può ordinare prima o dopo a ab
seconda della regola della lingua (alcune lingue hanno <MIN>
prima <CAP>
come nell'inglese britannico, altre <CAP>
prima <MIN>
come nell'estone).
Se e
avesse lo stesso ordinamento di ɛ
, printf '%s\n' e ɛ | sort -u
restituirebbe solo una riga. Ma come <BAS>
prima <PCL>
, e
solo prima ɛ
. eɛe
ordina dopo EEE
(al peso secondario) anche se EEE
ordina dopo eee
(per il quale dobbiamo salire al terzo peso).
Ora se sul mio sistema con glibc 2.27, corro:
sed -n 's/\(.*;[^[:blank:]]*\).*/\1/p' /usr/share/i18n/locales/iso14651_t1_common |
sort -k2 | uniq -Df1
Noterai che ci sono alcuni personaggi che sono stati definiti con gli stessi 4 pesi esatti. In particolare, il nostro ɛ ha gli stessi pesi di:
<U01DD> <e>;<PCL>;<MIN>;IGNORE
<U0259> <e>;<PCL>;<MIN>;IGNORE
<U025B> <e>;<PCL>;<MIN>;IGNORE
E abbastanza sicuro:
$ printf '%s\n' $'\u01DD' $'\u0259' $'\u025B' | sort -u
ǝ
$ expr ɛ = ǝ
1
Questo può essere visto come un bug di GNU libc locales. Sulla maggior parte degli altri sistemi, le impostazioni locali assicurano che tutti i diversi caratteri abbiano un diverso ordinamento alla fine. Sul locali GNU, diventa ancora peggio, in quanto vi sono migliaia di caratteri che non dispongono di un ordinamento e finiscono per l'ordinamento stesso, causando problemi di ogni genere (come rottura comm
, join
, ls
o gocce con gli ordini non deterministici ... ), quindi la raccomandazione di utilizzare LC_ALL=C
per aggirare tali problemi .
Come notato da @ninjalj nei commenti, glibc 2.28 rilasciato nell'agosto 2018 è arrivato con alcuni miglioramenti su questo fronte sebbene AFAICS, ci siano ancora alcuni personaggi o elementi di fascicolazione definiti con lo stesso ordinamento. Su Ubuntu 18.10 con glibc 2.28 e in una locale en_GB.UTF-8.
$ expr $'L\ub7' = $'L\u387'
1
(perché U + 00B7 sarebbe considerato equivalente a U + 0387 solo se combinato con L
/ l
?!).
E:
$ 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
(ancora oltre 1 milione di caratteri (95% dell'intervallo Unicode, in calo dal 98% in 2,27) ordinamento uguale agli altri caratteri in quanto il loro ordine di ordinamento non è definito).
Guarda anche: