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 Ehanno lo stesso peso primario, ee Elo 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. Abordina tra aae ac, ma Abpuò ordinare prima o dopo a abseconda della regola della lingua (alcune lingue hanno <MIN>prima <CAP>come nell'inglese britannico, altre <CAP>prima <MIN>come nell'estone).
Se eavesse lo stesso ordinamento di ɛ, printf '%s\n' e ɛ | sort -urestituirebbe solo una riga. Ma come <BAS>prima <PCL>, esolo prima ɛ . eɛeordina dopo EEE(al peso secondario) anche se EEEordina 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, lso gocce con gli ordini non deterministici ... ), quindi la raccomandazione di utilizzare LC_ALL=Cper 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: