चलो अगर मैं इस स्पष्ट कर सकते हैं देखते हैं:
"मल्टी-बाइट वर्ण स्ट्रिंग" एक अस्पष्ट पद के साथ शुरू करने के लिए है, लेकिन माइक्रोसॉफ्ट की दुनिया में, यह आमतौर पर meants "नहीं ASCII, और नहीं UTF- 16 "। इस प्रकार, आप कुछ वर्ण एन्कोडिंग का उपयोग कर सकते हैं जो 1 बाइट प्रति चरित्र, या 2 बाइट्स, या संभवतः अधिक का उपयोग कर सकता है। जैसे ही आप करते हैं, स्ट्रिंग में वर्णों की संख्या! = स्ट्रिंग में बाइट्स की संख्या।
चलिए यूटीएफ -8 को उदाहरण के रूप में लेते हैं, भले ही इसका उपयोग एमएस प्लेटफॉर्म पर नहीं किया जाता है। चरित्र को स्मृति में "c3 a9" के रूप में एन्कोड किया गया है - इस प्रकार, दो बाइट्स, लेकिन 1 वर्ण। अगर मैं स्ट्रिंग "द" है, यह है:
text: t h é \0
mem: 74 68 c3 a9 00
यह एक "नल समाप्त" स्ट्रिंग, में है कि यह एक अशक्त के साथ समाप्त होता है। कार्यों के एक धसान उस के साथ सौदा करने में मदद करने
struct my_string
{
size_t length;
char *data;
};
... और: यदि हम अपने स्ट्रिंग यह में nulls की अनुमति चाहता था, हम इस तरह के रूप में, कुछ अन्य फैशन में आकार संग्रहीत करने की आवश्यकता होगी। (यह कैसे काम करता है std::string
की तरह, काफी मोटे तौर पर है।)
अशक्त-समाप्त तार के लिए, तथापि, strlen()
उनके आकार बाइट्स, नहीं अक्षरों में गणना होगी। (वर्णों की गिनती के लिए अन्य फ़ंक्शन हैं) strlen
0 बाइट को देखने से पहले केवल बाइट्स की संख्या की गणना करता है - कुछ भी फैंसी नहीं।
अब, एमएस की दुनिया में "चौड़ा" या "यूनिकोड" स्ट्रिंग यूटीएफ -16 स्ट्रिंग का संदर्भ देता है। उनमें बाइट्स की संख्या में समान समस्याएं हैं! = वर्णों की संख्या। (इसके अलावा: की संख्या बाइट्स/2 = वर्णों की संख्या!) चलो फिर से thé को देखो:
text: t h é \0
shorts: 0x0074 0x0068 0x00e9 0x0000
mem: 74 00 68 00 e9 00 00 00
है कि "द" UTF-16 में, थोड़ा endian में जमा हो जाती है (जो है क्या अपने ठेठ डेस्कटॉप है)। सभी 00 बाइट्स पर ध्यान दें - ये यात्रा ऊपर की ओर बढ़ती हैं। इस प्रकार, हम wcslen
पर कॉल करते हैं, जो इसे 2-बाइट short
एस के रूप में देखता है, एकल बाइट नहीं।
आखिरकार, आपके पास TCHAR
एस है, जो उपरोक्त दो मामलों में से एक है, UNICODE
पर निर्भर करता है। _tcslen
उचित समारोह (या तो strlen
या wcslen
) हो जाएगा, और TCHAR
या तो char
या wchar_t
हो जाएगा। TCHAR
विंडोज दुनिया में यूटीएफ -16 में जाने के लिए आसान बनाने के लिए बनाया गया था।
स्ट्रिंग के बाइट्स में आकार की गणना करने के लिए आपका कोड सही है। कथन "के लिए काम करता है ... char और wchar_t ... लेकिन मल्टीबाइट-कैरेक्टर स्ट्रिंग्स के लिए नहीं" हालांकि उलझन में है। – Thanatos
तो मल्टीबाइट-कैरेक्टर स्ट्रिंग में नल बाइट्स नहीं हैं? – flacs
@ टिलका: वे कर सकते थे, लेकिन आपको किसी अन्य फैशन में लंबाई जानने की आवश्यकता होगी, जैसे स्ट्रिंग के साथ आने वाले पूर्णांक में इसे संग्रहीत करना। नल को तारों को समाप्त कर दिया जाता है, जो कि आम तौर पर मुठभेड़ करते हैं (और क्या _tcslen, strlen, आदि की आवश्यकता होती है), नल टर्मिनेटर को छोड़कर, शून्य बाइट्स नहीं होते हैं। – Thanatos