Wc -m और wc -c अलग क्यों हैं?


12

एक सी प्रोग्रामर के रूप में, मुझे यह देखकर आश्चर्य हुआ कि wc -c(जो बाइट्स की संख्या की गणना करता है), और wc -m(जो वर्णों की संख्या को गिनता है) मेरा एक लंबा, पाठ फ़ाइल के लिए बहुत अलग परिणाम देता है। मुझे हमेशा बताया गया है कि sizeof(char)1 बाइट है।

qdii@nomada ~/Documents $ wc -c sentences.csv
102990983 sentences.csv
qdii@nomada ~/Documents $ wc -m sentences.csv
89023123 sentences.csv

कोई स्पष्टीकरण?


नीचे @ rici का उत्तर देखें ... आपने अपने प्रश्न में (c = बाइट्स, m = वर्ण) पीछे अपने -m और -c झंडे प्राप्त किए हैं ... हालांकि आपका उदाहरण आउटपुट सही है।
दान

जवाबों:


20

charसी में प्रकार एक बाइट है, लेकिन यह ASCII वर्ण लिए करना है; देखते हैं परिवर्तनीय चौड़ाई एन्कोडिंग UTF-8 कि चरित्र प्रति कई बाइट का समय लग सकता है। पर्यावरण चर द्वारा निर्धारित स्थान के आधार पर मल्टीबीट अनुक्रमों को डीकोड करने के wcलिए mbrtowc(3)फ़ंक्शन का उपयोग करता है LC_CTYPE। यदि आप स्थान को ठीक से सेट करते हैं, तो आपको सभी मामलों के लिए समान परिणाम प्राप्त करना चाहिए। उदाहरण के लिए:

qdii@nomada ~/Documents $ LC_CTYPE="C" wc -m sentences.csv
102990983 sentences.csv

16

एक अनुमान पर,

  1. आपका स्थान UTF-8 एन्कोडिंग और, का उपयोग करता है

  2. आपकी फ़ाइल के लगभग 10% में ऐसे वर्ण होते हैं, जिन्हें UTF-8 में एन्कोड करने के लिए एक से अधिक ऑक्टेट की आवश्यकता होती है।

वैसे, से man wc:

   -c, --bytes
          print the byte counts

   -m, --chars
          print the character counts
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.