यह उन वर्णों का एक ही क्रमबद्ध क्रम है।
आप यह भी देखेंगे कि
sort -u << EOF
■
⅕
⅖
⅗
EOF
केवल एक लाइन देता है।
या वो:
expr ■ = ⅕
सच लौटाता है (POSIX द्वारा आवश्यक)।
जीएनयू सिस्टम के साथ भेजे जाने वाले अधिकांश स्थानों में वर्णों की एक संख्या होती है (और वर्णों के अनुक्रम भी (क्रमबद्ध करने वाले अनुक्रम)) जिनमें क्रमबद्ध क्रम होता है। उन the लोगों के मामले में, यह इसलिए है क्योंकि यह आदेश परिभाषित नहीं है, और जिन वर्णों के क्रम को परिभाषित नहीं किया गया है, वे GNU सिस्टम में समान क्रमबद्ध क्रम रखते हैं। ऐसे वर्ण हैं जिन्हें स्पष्ट रूप से Ş और Ș जैसे समान क्रम वाले आदेश के रूप में परिभाषित किया गया है (हालांकि यह स्पष्ट रूप से मेरे लिए कोई तर्क नहीं है) कि यह कैसे किया जाता है।
यह काफी आश्चर्यजनक और संगीन व्यवहार का स्रोत है। मैंने हाल ही में ऑस्टिन समूह (POSIX और एकल UNIX विनिर्देशन के पीछे निकाय) की मेलिंग सूची पर मुद्दा उठाया है और चर्चा अभी भी 2015-04-03 तक जारी है।
इस मामले में, चाहे वह कहां से [y]
मेल खाना चाहिए और उसी के अनुसार यह मेरे लिए अस्पष्ट है, लेकिन चूंकि एक ब्रैकेट अभिव्यक्ति का मतलब एक कोलाजिंग तत्व से मेल खाता है, जो यह बताता है कि व्यवहार अपेक्षित है।x
x
y
bash
किसी भी मामले में, मुझे लगता है [⅕-⅕]
या कम से कम [⅕-⅖]
मेल खाना चाहिए ■
।
आप देखेंगे कि विभिन्न उपकरण अलग तरह से व्यवहार करते हैं। ksh93 की तरह व्यवहार करता है bash
, GNU grep
या sed
नहीं। कुछ अन्य गोले अलग व्यवहार करते हैं जैसे yash
कुछ और भी छोटी गाड़ी।
एक सुसंगत व्यवहार करने के लिए, आपको एक स्थान की आवश्यकता होती है जहाँ सभी वर्ण अलग-अलग प्रकार के होते हैं। सी लोकेल एक विशिष्ट है। हालाँकि अधिकांश सिस्टम पर C लोकेल में सेट किया गया वर्ण ASCII है। जीएनयू सिस्टम पर, आपके पास आमतौर पर एक C.UTF-8
लोकेल तक पहुंच होती है, जिसे यूटीएफ -8 चरित्र पर काम करने के बजाय उपयोग किया जा सकता है।
इसलिए:
(export LC_ALL=C.UTF-8; [[ ■ = [⅕⅖⅗] ]])
या मानक समकक्ष:
(export LC_ALL=C.UTF-8
case ■ in ([⅕⅖⅗]) true;; (*) false; esac)
झूठे लौटना चाहिए।
एक अन्य विकल्प केवल LC_COLLATE
C पर सेट किया जाएगा जो GNU सिस्टम पर काम करेगा, लेकिन दूसरों पर जरूरी नहीं कि यह मल्टी-बाइट कैरेक्टर के क्रम को निर्दिष्ट करने में विफल हो सकता है।
इसका एक सबक यह है कि समानता एक धारणा के रूप में स्पष्ट नहीं है क्योंकि जब यह तार की तुलना करने की बात आती है तो कोई उम्मीद नहीं करेगा। समानता का मतलब हो सकता है, सबसे कम से कम सख्त से।
- बाइट्स और सभी बाइट घटकों की समान संख्या का समान मूल्य है।
- समान वर्ण और सभी वर्ण समान हैं (उदाहरण के लिए, वर्तमान वर्णमाला में समान कोडपाइंट को देखें)।
- दो तार में लोकेल के कॉलेशन एल्गोरिथ्म के अनुसार एक ही क्रमबद्ध क्रम होता है (अर्थात, न तो <b और न ही b> a सत्य है)।
अब, 2 या 3 के लिए, मान लें कि दोनों तारों में वैध वर्ण हैं। UTF-8 और कुछ अन्य एन्कोडिंग में, बाइट्स के कुछ अनुक्रम वैध वर्ण नहीं बनाते हैं।
1 और 2 जरूरी नहीं है कि इसकी वजह से समतुल्य हो, या क्योंकि कुछ पात्रों में एक से अधिक संभव एन्कोडिंग हो सकते हैं। यही कारण है कि आम तौर पर आईएसओ-2022-जेपी की तरह स्टेटफुल एनकोडिंग जहां का मामला है A
के रूप में व्यक्त किया जा सकता है 41
या 1b 28 42 41
( 1b 28 42
, मैं हालांकि जा रहा है ASCII करने के लिए स्विच करने के लिए अनुक्रम और आप के रूप में आप चाहते हैं उन में से कई, कि एक फर्क नहीं होगा के रूप में सम्मिलित कर सकते हैं) उन प्रकार के एन्कोडिंग का अभी भी उपयोग होने की उम्मीद नहीं है, और जीएनयू उपकरण कम से कम आमतौर पर उनके साथ ठीक से काम नहीं करते हैं।
यह भी सावधान रहें कि अधिकांश गैर-जीएनयू उपयोगिताओं 0 बाइट मान (एएससीआईआई में एनयूएल चरित्र) के साथ सौदा नहीं कर सकती हैं।
उन परिभाषाओं में से किसका उपयोग किया जाता है यह उपयोगिता और उपयोगिता कार्यान्वयन या संस्करण पर निर्भर करता है। उस पर POSIX 100% स्पष्ट नहीं है। C लोकेल में, सभी 3 बराबर हैं। उस YMMV के बाहर।