いいえ、それは同等とは見なされず、単に同じ主要重量を持ちます。そのため、最初の近似では、それらは同じようにソートされます。
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
同じセカンダリウェイトを持ち、3番目のウェイトだけがそれらを区別します。
文字列を比較するときsort
(strcoll()
標準のlibc関数は文字列を比較するために使用されます)、すべての文字のプライマリウェイトを比較することから始まり、文字列がプライマリウェイトと等しい場合(他のウェイトと同様)、2番目のウェイトのみに進みます。
これが、最初の近似のソート順で大文字小文字が無視されるように見える方法です。Ab
との間aa
で並べ替えますac
が、言語規則Ab
にab
応じて前後に並べ替えることができます(一部の言語では、<MIN>
前<CAP>
に英国英語、<CAP>
前<MIN>
にエストニア語などがあります)。
場合はe
、同じソート順を持っていたとしてɛ
、printf '%s\n' e ɛ | sort -u
一つだけの行が返されます。しかしとして<BAS>
のソートの前に<PCL>
、e
一人でのソートの前に ɛ
。eɛe
後にソートしEEE
ていても(二重に)EEE
ソートが後にeee
(そのために私たちは第三体重まで行く必要があります)。
glibc 2.27を使用しているシステムで次のコマンドを実行すると:
sed -n 's/\(.*;[^[:blank:]]*\).*/\1/p' /usr/share/i18n/locales/iso14651_t1_common |
sort -k2 | uniq -Df1
まったく同じ4つの重みで定義された文字がかなりあることに気付くでしょう。特に、ourの重みは次と同じです。
<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
非決定論注文を持つか、グロブ... )、したがって、これらの問題を回避するために使用LC_ALL=C
することをお勧めします。
@ninjaljのコメントで指摘されているように、2018年8月にリリースされたglibc 2.28にはAFAICSがありますが、同じ並べ替え順序で定義されたいくつかの文字または照合要素がまだありますが、その面でいくつかの改善が行われました。glibc 2.28を使用し、en_GB.UTF-8ロケールのUbuntu 18.10で。
$ 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
(100万文字以上(Unicode範囲の95%、2.27の98%から)は、ソート順が定義されていないため、他の文字と同じようにソートされます)。
こちらもご覧ください: