2008-09-28 13 views
12

मैं XML फ़ाइलों को पार्स/बनाने के लिए TinyXML का उपयोग कर रहा हूं। अब, the documentation के अनुसार यह लाइब्रेरी यूटीएफ -8 के माध्यम से मल्टीबाइट चरित्र सेट का समर्थन करती है। अब तक मुझे लगता है कि बहुत अच्छा है। लेकिन, पुस्तकालय प्रदान करने वाला एकमात्र एपीआई (तत्व नाम प्राप्त करने/सेट करने, विशेषता नाम और मानों के लिए ... ... जहां भी एक स्ट्रिंग का उपयोग किया जाता है) std::string या const char* के माध्यम से होता है। इसने मुझे मल्टीबाइट चरित्र सेट समर्थन की अपनी समझ पर संदेह किया है। एक स्ट्रिंग जो केवल 8-बिट वर्णों का समर्थन करती है, में 16 बिट वर्ण होता है (जब तक कि यह कोड पृष्ठ का उपयोग नहीं करता है, जो 'यूनिकोड' दावे का समर्थन करता है)? मैं समझता हूं कि आप सैद्धांतिक रूप से 16-बिट कोड पॉइंट ले सकते हैं और इसे std::string में 2 वर्णों में विभाजित कर सकते हैं, लेकिन यह std::string को 'यूनिकोड' स्ट्रिंग में परिवर्तित नहीं करेगा, इससे अधिकांश उद्देश्यों के लिए यह अमान्य हो जाएगा और शायद गलती से फ़ाइल में लिखे जाने पर और किसी अन्य प्रोग्राम द्वारा पढ़े जाने पर काम करें।TinyXML का यूटीएफ -8 समर्थन कैसे काम करता है?

तो, क्या कोई मुझे बता सकता है कि लाइब्रेरी कैसे '8-बिट इंटरफ़ेस' (std::string या const char*) प्रदान कर सकती है और अभी भी 'यूनिकोड' स्ट्रिंग का समर्थन करती है?

(शायद मैंने यहां कुछ यूनिकोड शब्दावली को मिश्रित किया है; उस से आने वाले किसी भी भ्रम के बारे में खेद है)।

उत्तर

8

सबसे पहले, utf-8 को const char * तारों में संग्रहीत किया जाता है, जैसा कि @quinmars ने कहा था। और यह न केवल 7-बिट ASCII का एक सुपरसेट है (कोड पॉइंट < = 127 हमेशा एक बाइट में स्वयं को एन्कोड किया जाता है), यह और भी सावधान है कि उन मानों के साथ बाइट कोड बिंदुओं के लिए मल्टीबाइट मानों के एन्कोडिंग के हिस्से के रूप में कभी भी उपयोग नहीं किए जाते हैं > = 128. तो यदि आप एक बाइट == 44 देखते हैं, तो यह '<' वर्ण आदि है। एक्सएमएल में सभी मेटाचर्स 7-बिट ASCII में हैं। तो कोई भी एक्सएमएल को पार्स कर सकता है, जहां स्ट्रैचिंग स्ट्रिंग्स, जहां मेटार्स कहते हैं, टुकड़े (शायद गैर-ASCII वर्णों सहित) को char * या std :: स्ट्रिंग में चिपकाते हैं, और लौटा हुआ टुकड़ा वैध यूटीएफ -8 स्ट्रिंग्स रहता है, भले ही पार्सर को विशेष रूप से यूटीएफ -8 नहीं पता था।

आगे (एक्सएमएल के लिए विशिष्ट नहीं, बल्कि चालाक), यहां तक ​​कि अधिक जटिल चीजें सामान्य रूप से काम करती हैं (टीएम)। उदाहरण के लिए, यदि आप बाइट्स द्वारा यूटीएफ -8 लेक्सिकोग्राफिक रूप से सॉर्ट करते हैं, तो आपको # बाइट्स में भिन्नता के बावजूद, कोड पॉइंट्स द्वारा लेक्सिकोग्राफिक रूप से सॉर्ट करने के समान उत्तर मिलता है, क्योंकि उपसर्ग बाइट्स लंबे समय तक (और इसलिए उच्च मूल्य वाले) कोड पेश करता है अंक कम मूल्यों के मुकाबले संख्यात्मक रूप से अधिक हैं)।

+0

ठीक है धन्यवाद, यह स्पष्ट हो रहा है, लेकिन फिर भी - यूटीएफ -8 डेटा का प्रतिनिधित्व करने के लिए std :: स्ट्रिंग का उपयोग करके, यह अर्थात् गलत नहीं है? आप उस स्ट्रिंग की सामग्री पर भरोसा नहीं कर पाएंगे - यह जानने का एक तरीका भी नहीं होगा कि यह कितना समय है! (चरित्र की लंबाई में)। – Roel

+0

और यहां तक ​​कि कॉन्स्ट char * संस्करण के लिए, आपको अभी भी स्ट्रिंग के साथ काम करने के लिए एक और लाइब्रेरी का उपयोग करना होगा। – Roel

+2

गलत से अधिक अपरिभाषित। std :: स्ट्रिंग के तरीकों (concatenation, iterator slicing, find_ *, आदि) अभी भी काम करते हैं। लंबाई() को वैसे भी == आकार() के रूप में परिभाषित किया जाता है। एक नई पूर्व शर्त है कि ऑफ़सेट एक चार सीमा पर हो। अगर std :: स्ट्रिंग ने एन्कोडिंग के बारे में कोई वादा किया है तो यह गलत होगा, लेकिन ऐसा नहीं है। – puetzk

2

यूटीएफ -8 7-बिट ASCII कोड के अनुकूल है। यदि बाइट का मान 127 से बड़ा है, तो इसका मतलब है कि एक मल्टीबाइट वर्ण शुरू होता है। पहले बाइट के मूल्य के आधार पर आप देख सकते हैं कि चरित्र कितने बाइट लेगा, जो पहले बाइट सहित 2-4 बाइट्स हो सकता है (तकनीकी भी 5 या 6 संभव है, लेकिन वे वैध utf-8 मान्य नहीं हैं)। यहां यूटीएफ -8: UTF-8 and Unicode FAQ के बारे में एक अच्छा संसाधन है, utf8 के लिए विकी पेज भी बहुत जानकारीपूर्ण है। चूंकि यूटीएफ -8 चार आधारित और 0-समाप्त होता है, इसलिए आप अधिकांश चीजों के लिए मानक स्ट्रिंग फ़ंक्शंस का उपयोग कर सकते हैं। एकमात्र महत्वपूर्ण बात यह है कि चरित्र गणना बाइट गिनती से भिन्न हो सकती है। स्ट्रेल() जैसे कार्य बाइट गिनती को वापस करते हैं लेकिन आवश्यक रूप से चरित्र गणना नहीं करते हैं।

0

एक यूनिकोड कोड बिंदु को एन्कोड करने के लिए 1 और 4 वर्णों के बीच उपयोग करके।

संबंधित मुद्दे