नहीं, यह उन्हें समतुल्य नहीं मानता है, उनका बस एक ही प्राथमिक वजन है। ताकि, पहले सन्निकटन में, वे एक ही क्रमबद्ध करें।
यदि आप एक GNU प्रणाली (यहाँ glibc 2.27 के साथ) पर / usr / share / i18n / locates / 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()
स्टैण्डर्ड की तुलना करने के लिए स्टैण्डर्ड लिबास फंक्शन का उपयोग किया जाता है) सभी वर्णों के प्राथमिक वज़न की तुलना करके शुरू होता है, और केवल दूसरे वज़न के लिए जाना जाता है यदि स्ट्रिंग्स प्राइमरी वेट के बराबर हैं (और इसी तरह दूसरे वेट के साथ) ।
ऐसा लगता है कि पहले सन्निकटन में छंटनी क्रम में मामले को नजरअंदाज किया गया है। 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 वज़न के साथ परिभाषित किया गया है। विशेष रूप से, हमारे particular में समान वजन है:
<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 स्थानों के बग के रूप में देखा जा सकता है। अधिकांश अन्य प्रणालियों पर, स्थान सुनिश्चित करते हैं कि सभी अलग-अलग वर्णों के अंत में अलग-अलग क्रमबद्ध क्रम होते हैं। जीएनयू स्थानों पर, यह, और भी बदतर हो जाता है के रूप में वहाँ अक्षर हैं जो एक छँटाई आदेश की जरूरत नहीं है और एक ही छँटाई अंत के हजारों रहे हैं, (तोड़ने जैसी समस्याओं के सभी प्रकार के कारण comm
, join
, ls
या गैर नियतात्मक आदेश होने globs ... ), इसलिए उन मुद्दों के आसपास काम करने के लिए उपयोग LC_ALL=C
करने की सिफारिश की गई है ।
जैसा कि @ninjalj द्वारा टिप्पणियों में उल्लेख किया गया है, अगस्त 2018 में जारी 2.28 glibc उस मोर्चे पर कुछ सुधार के साथ आया था हालांकि AFAICS, अभी भी कुछ अक्षर या समान तत्वों को समान क्रमबद्धता के साथ परिभाषित किया गया है। Ubuntu 18.10 पर glibc 2.28 के साथ और एक en_GB.UTF-8 लोकेल में।
$ expr $'L\ub7' = $'L\u387'
1
(क्यों U + 00B7 को U + 0387 के बराबर माना जाएगा जब L
/ l
!) के साथ जोड़ा जाएगा ।
तथा:
$ 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
(अभी भी 1 मिलियन से अधिक वर्ण (यूनिकोड श्रेणी का 95%, 2.27 में 98% से नीचे) अन्य वर्णों की तरह ही छंटनी करते हैं क्योंकि उनका क्रम क्रम परिभाषित नहीं है)।
यह भी देखें: