नहीं, यह उन्हें समतुल्य नहीं मानता है, उनका बस एक ही प्राथमिक वजन है। ताकि, पहले सन्निकटन में, वे एक ही क्रमबद्ध करें।
यदि आप एक 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% से नीचे) अन्य वर्णों की तरह ही छंटनी करते हैं क्योंकि उनका क्रम क्रम परिभाषित नहीं है)।
यह भी देखें: