Hayır, onları eşdeğer olarak görmüyor, sadece aynı birincil ağırlığa sahipler. Böylece, ilk yaklaşımda aynı şekilde sıralarlar.
Bir GNU sisteminde / usr / share / i18n / locales / iso14651_t1_common'a (çoğu yerel ayar için temel olarak kullanılır) bakarsanız (burada glibc 2.27 ile birlikte) göreceksiniz:
<U0065> <e>;<BAS>;<MIN>;IGNORE # 259 e
<U025B> <e>;<PCL>;<MIN>;IGNORE # 287 ɛ
<U0045> <e>;<BAS>;<CAP>;IGNORE # 577 E
e
, ɛ
Ve E
aynı birincil ağırlığa sahip e
ve E
aynı ikincil ağırlığı, sadece üçüncü ağırlık bunları ayırır.
Dizeleri karşılaştırırken, sort
( strcoll()
standart libc işlevi dizeleri karşılaştırmak için kullanılır), tüm karakterlerin birincil ağırlıklarını karşılaştırarak başlar ve dizelerin birincil ağırlıklara eşit olması durumunda yalnızca ikinci ağırlığa gider (ve diğer ağırlıklarla vb.) .
İlk yaklaşımda durum sıralama düzeninde göz ardı ediliyor gibi görünüyor. Ab
arasındaki sıralar aa
ve ac
ancak Ab
sıralama önce veya sonra olabilir ab
(bazı diller var dil kuralına bağlı olarak <MIN>
önce <CAP>
İngiliz İngilizcesi, bazılarında gibi <CAP>
önce <MIN>
Estonya gibi).
Eğer e
aynı sıralama düzenini olarak vardı ɛ
, printf '%s\n' e ɛ | sort -u
sadece bir satır döndürecektir. Ama <BAS>
türlü önce <PCL>
, e
tek başına sıralar önce ɛ
. eɛe
sonradan EEE
(ikincil ağırlıkta) EEE
sonradan sıralama yapar eee
(bunun için üçüncü ağırlığa çıkmamız gerekir).
Şimdi eğer sistemimde glibc 2.27 varsa, çalıştırıyorum:
sed -n 's/\(.*;[^[:blank:]]*\).*/\1/p' /usr/share/i18n/locales/iso14651_t1_common |
sort -k2 | uniq -Df1
Aynı 4 ağırlıkta tanımlanmış birkaç karakterin olduğunu fark edeceksiniz. Özellikle, bizim our ile aynı ağırlıklara sahiptir:
<U01DD> <e>;<PCL>;<MIN>;IGNORE
<U0259> <e>;<PCL>;<MIN>;IGNORE
<U025B> <e>;<PCL>;<MIN>;IGNORE
Ve elbette:
$ printf '%s\n' $'\u01DD' $'\u0259' $'\u025B' | sort -u
ǝ
$ expr ɛ = ǝ
1
Bu GNU libc yerellerinin bir böceği olarak görülebilir. Diğer çoğu sistemde, yerel ayarlar, tüm farklı karakterlerin sonunda farklı sıralama düzenine sahip olduğundan emin olun. Bir sıralama düzeni var ve aynı sıralama sonunda yok karakterlerin binlercesi var GNU yerel üzerinde, kırılma gibi (sorunların her türlü neden, hatta kötüleşir comm
, join
, ls
deterministik olmayan emir sahip veya Neználkovo ... ), bu nedenle bu sorunlar etrafında çalışmak için kullanmaLC_ALL=C
önerisi .
Yorumlarda @ ninjalj tarafından belirtildiği gibi, Ağustos 2018'de yayımlanan glibc 2.28, AFAICS'te yine de aynı sıralama düzeninde tanımlanmış bazı karakterler veya harmanlama öğeleri olmasına rağmen, bu cephede bazı iyileştirmelerle geldi. Ubuntu 18.10'da, glibc 2.28 ve en_GB.UTF-8 yerel ayarında.
$ expr $'L\ub7' = $'L\u387'
1
(U + 00B7 neden yalnızca L
/ ?! ile birleştiğinde U + 0387 olarak eşdeğer sayılır l
?)
Ve:
$ 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
(hala 1 milyondan fazla karakter (Unicode aralığının% 95'i, 2.27'de% 98'den düşme), sıralama düzenleri tanımlanmadığı gibi diğer karakterlerle aynı sıralamada bulunur).
Ayrıca bakınız: