$ locale charmap
UTF-8
मेरे वर्तमान परिवेश में, वर्ण सेट UTF-8 है, अर्थात्, वर्ण प्रति वर्ण 1 से 4 बाइट्स के साथ एन्कोडेड हैं (हालांकि क्योंकि UTF-8 की मूल परिभाषा वर्ण कोड 0x7fffffff तक की है, अधिकांश उपकरण UTF- को पहचानते हैं 6 बाइट्स के 8 बाइट सीक्वेंस)।
उस वर्ण सेट में, यूनिकोड के सभी वर्ण उपलब्ध हैं, एक a
बाइट मान 65 के रूप में कोडित है, 乕
3 बाइट्स 228 185 149 के é
रूप में और उदाहरण के लिए दो बाइट अनुक्रम 195 169।
$ printf 乕 | wc -mc
1 3
$ printf a | wc -mc
1 1
अभी व:
$ export fr_FR.iso885915@euro
$ locale charmap
ISO-8859-15
मैंने अपने परिवेश को संशोधित किया है, जहाँ अब सेट किया गया ISO-8859-15 (भाषा, मुद्रा प्रतीक, तिथि प्रारूप जैसी अन्य चीज़ों को भी संशोधित किया गया है, उन क्षेत्रीय सेटिंग्स के संग्रह को लोकेल के रूप में संदर्भित किया जा रहा है )। मुझे इसके वातावरण में एक नया टर्मिनल एमुलेटर शुरू करने की आवश्यकता है ताकि इसके चरित्र को नए स्थान पर प्रस्तुत किया जा सके।
ISO-8859-15 एक एकल बाइट वर्ण सेट है जिसका अर्थ है कि इसमें केवल 256 वर्ण हैं (वास्तव में इससे भी कम वास्तव में कवर किए गए हैं)। यह विशिष्ट वर्ण सेट पश्चिमी यूरोप की भाषाओं के लिए उपयोग किया जाता है क्योंकि यह अपनी अधिकांश भाषाओं (और यूरो प्रतीक) को कवर करता है।
इसमें a
यूटीएफ -8 या एएससीआईआई में बाइट मान 65 के साथ चरित्र है, इसमें é
चरित्र भी है (उदाहरण के लिए आमतौर पर फ्रेंच या स्पेनिश में उपयोग किया जाता है), लेकिन बाइट मूल्य 233 के साथ, इसमें। वर्ण नहीं है।
उस वातावरण में, wc -c
और wc -m
हमेशा एक ही परिणाम देगा।
अधिकांश आधुनिक यूनिक्स जैसी प्रणालियों पर उबंटू में, डिफ़ॉल्ट आमतौर पर यूटीएफ -8 है क्योंकि यह एकमात्र समर्थित वर्ण सेट (और एन्कोडिंग) है जो पूरे यूनिकोड रेंज को कवर करता है।
अन्य मल्टी-बाइट चरित्र एन्कोडिंग मौजूद हैं, लेकिन वे उबंटू पर समर्थित नहीं हैं और आपको उन लोगों के साथ एक स्थान उत्पन्न करने में सक्षम होने के लिए हुप्स से गुजरना पड़ता है, और यदि आप करते हैं, तो आप पाएंगे कि कई चीजें नहीं हैं ठीक से काम करो।
तो उबंटू पर प्रभाव में, चरित्र सेट या तो सिंगल-बाइट, या यूटीएफ -8 हैं।
अब, कुछ और नोट:
UTF-8 में, सभी बाइट अनुक्रम वैध वर्ण नहीं बनाते हैं। उदाहरण के लिए, सभी UTF-8 अक्षर जो ASCII वाले नहीं हैं, बाइट्स के साथ बनते हैं, जिनमें से सभी का 8 वां बिट सेट होता है, लेकिन जहां पहले वाले में 7 वां बिट सेट होता है।
यदि आपके पास 8 वें बिट सेट के साथ बाइट्स का क्रम है, जिनमें से कोई भी 7 बिट सेट नहीं है, तो उसे किसी वर्ण में अनुवादित नहीं किया जा सकता है। और ऐसा तब है जब आप समस्याओं और विसंगतियों को शुरू कर रहे हैं क्योंकि सॉफ़्टवेयर को नहीं पता है कि उन लोगों के साथ क्या करना है। उदाहरण के लिए:
$ printf '\200\200\200' | wc -mc
0 3
$ printf '\200\200\200' | grep -q . || echo no
no
wc
और grep
वहां कोई चरित्र नहीं मिलता है लेकिन:
$ x=$'\200\200\200' bash -c 'echo "${#x}"'
3
bash
पाता है 3. जब यह एक चरित्र को बाइट्स के अनुक्रम को मैप नहीं कर सकता है, तो यह प्रत्येक बाइट को एक चरित्र मानता है।
यह और भी अधिक जटिल हो सकता है क्योंकि यूनिकोड में कोडपॉइंट्स हैं जो वर्णों के रूप में अमान्य हैं, और कुछ जो गैर-वर्ण हैं , और उपकरण के आधार पर, उनके UTF-8 एन्कोडिंग को एक चरित्र के रूप में माना जा सकता है या नहीं माना जा सकता है।
एक और बात को ध्यान में रखना चरित्र और अंगूर के बीच अंतर है, और वे कैसे प्रदान किए जाते हैं।
$ printf 'e\u301\u20dd\n'
é⃝
$ printf 'e\u301\u20dd' | wc -mc
3 6
वहाँ, हमने 3 वर्णों को 6 बाइट्स के रूप में एक वर्णमाला के रूप में प्रस्तुत किया है, क्योंकि हमें 3 वर्ण एक साथ मिल गए हैं (एक आधार वर्ण, एक तीव्र उच्चारण और एक संयोजन घेरा)।
उबुन्टु wc
पर पाया गया GNU कार्यान्वयन -L
इनपुट में सबसे चौड़ी लाइन की डिस्प्ले चौड़ाई बताने के लिए एक स्विच है:
$ printf 'e\u301\u20dd\n' | wc -L
1
आपको यह भी पता चलेगा कि कुछ अक्षर उस चौड़ाई की गणना में 2 कोशिकाओं पर कब्जा कर लेते हैं जैसे कि 乕
ऊपर से हमारा चरित्र:
$ echo 乕 | wc -L
2
निष्कर्ष रूप में: जंगल शब्द में, बाइट, वर्ण और अंगूर जरूरी नहीं हैं।