2013-09-07 8 views
6

यदि मैं अच्छी तरह से समझता हूं, तो यूटीएफ -8 टेक्स्ट को स्टोर करने के लिए स्ट्रिंग और wstring दोनों का उपयोग करना संभव है।std :: स्ट्रिंग और यूटीएफ -8 एन्कोडेड यूनिकोड

  • चार के साथ

    , ASCII वर्ण एक एकल बाइट ले, कुछ चीनी अक्षरों 3 या 4, आदि ले जिसका मतलब है कि str[3] जरूरी 4 चरित्र को इंगित नहीं करता है।

  • wchar_t एक ही बात है, लेकिन पात्रों प्रति इस्तेमाल किया बाइट्स की कम से कम राशि के साथ हमेशा 2 (बजाय char के लिए 1) है, और एक 3 या 4 बाइट विस्तृत चरित्र 2 wchar_t ले जाएगा।

सही?

तो, अगर मैं string::find_first_of() या string::compare(), आदि का उपयोग करना चाहता हूं तो ऐसी अजीब एन्कोडेड स्ट्रिंग के साथ? क्या ये काम करेगा ? क्या स्ट्रिंग क्लास इस तथ्य को संभालती है कि वर्णों में एक चर आकार है? या मुझे केवल उन्हें डमी फीचर-कम बाइट एरे के रूप में उपयोग करना चाहिए, इस मामले में मैं wchar_t[] बफर के लिए जाना चाहूंगा।

std::string कि, दूसरा सवाल संभाल नहीं होता है: वहाँ है कि कि UTF-8 एन्कोडिंग संभाल सकता है, ताकि str[3] वास्तव में 3 चरित्र को इंगित करता है (जो 4 लंबाई 1 से एक बाइट सरणी होगा स्ट्रिंग कक्षाएं उपलब्ध कराने के पुस्तकालय हैं)?

+0

ध्यान दें कि भले ही 'str [3] 'चौथा कोड बिंदु था, यह चौथा उपयोगकर्ता-अनुमानित चरित्र नहीं है। – delnan

+1

@ डेलनान _ क्षमा करें (मैंने अभी wchar_t, विंडोज़ और यूटीएफ -16 के बारे में एक उदाहरण लेख चुना है)। चूंकि इसे संपादित करने में बहुत देर हो चुकी है, मैंने टिप्पणी हटा दी है, और यहां "विवादास्पद" लिंक के बिना हिस्सा वापस आ गया है: _ मुझे लगता है कि 'wchar_t' का आकार कार्यान्वयन-परिभाषित है, इसलिए _not_ हमेशा 2 बाइट्स। इसके अलावा (आईआईआरसी) विंडोज यूटीएफ -16 की तरह कुछ स्टोर करने के लिए इसका उपयोग करता है, यूटीएफ -8 नहीं। Http://en.wikipedia.org/wiki/Wide_character –

उत्तर

5

आप यूनिकोड के बारे में बात कर रहे हैं। यूनिकोड एक चरित्र का प्रतिनिधित्व करने के लिए 32 बिट्स का उपयोग करता है। हालांकि चूंकि यह स्मृति बर्बाद कर रहा है, वहां अधिक कॉम्पैक्ट एन्कोडिंग हैं। यूटीएफ -8 एक ऐसा एन्कोडिंग है। यह मानता है कि आप बाइट इकाइयों का उपयोग कर रहे हैं और यह यूनिकोड वर्णों को 1, 2, 3 या 4 बाइट्स पर मैप करता है। यूटीएफ -16 एक और है जो शब्दों को यूनिट के रूप में उपयोग कर रहा है और यूनिकोड वर्णों को 1 या 2 शब्दों (2 या 4 बाइट्स) पर नक्शा बनाता है। आप स्ट्रिंग और wchar_t दोनों के साथ दोनों एन्कोडिंग का उपयोग कर सकते हैं। यूटीएफ -8 अंग्रेजी पाठ/संख्याओं के लिए अधिक कॉम्पैक्ट होने लगता है।

कुछ चीजें एन्कोडिंग और उपयोग किए जाने वाले प्रकार (तुलना) के बावजूद काम करती हैं। हालांकि सभी कार्यों को एक चरित्र को समझने की आवश्यकता है तोड़ दिया जाएगा। I.e 5 वें चरित्र अंतर्निहित सरणी में हमेशा 5 वीं प्रविष्टि नहीं है। ऐसा लगता है कि यह कुछ उदाहरणों के साथ काम कर रहा है लेकिन अंततः यह टूट जाएगा। स्ट्रिंग :: तुलना काम करेगी लेकिन वर्णमाला क्रम प्राप्त करने की अपेक्षा न करें। वह भाषा निर्भर है। स्ट्रिंग :: find_first_of कुछ के लिए काम करेगा लेकिन सभी नहीं। लंबी स्ट्रिंग शायद काम करेगी क्योंकि वे लंबे समय तक हैं जबकि छोटे लोग चरित्र संरेखण से भ्रमित हो सकते हैं और बग खोजने के लिए बहुत मेहनत कर सकते हैं।

सबसे अच्छी बात यह है कि एक पुस्तकालय ढूंढना जो आपके लिए इसे संभालता है और नीचे दिए गए प्रकार को अनदेखा करता है (जब तक कि आपके पास एक या दूसरे को चुनने के मजबूत कारण न हों)।

+0

देखें अपने उत्तर के लिए धन्यवाद। – Virus721

+5

* यूनिकोड एक चरित्र का प्रतिनिधित्व करने के लिए 32 बिट्स का उपयोग करता है। * => वास्तव में निर्भर करता है कि आप एक चरित्र को क्या कहते हैं। यूनिकोड कोड पॉइंट्स (इंटीगर्स) और ग्रैफेम्स (पूर्णांक के अनुक्रम, आमतौर पर आकार 1) को परिभाषित करता है, और लोग "चरित्र" को "ग्रैफेम" से जोड़ते हैं क्योंकि यह स्क्रीन पर दिखाई देने वाली दृश्य इकाई है। –

+0

_ यूनिकोड एक वर्ण का प्रतिनिधित्व करने के लिए 32 बिट्स का उपयोग करता है।यह गलत है! यूनिकोड ** ** ** किसी चरित्र का प्रतिनिधित्व करने के लिए बिट्स की किसी भी मात्रा का उपयोग नहीं करता है। यूनिकोड पूरी तरह से सार है। यह प्रत्येक चरित्र को एक संख्या निर्दिष्ट करता है। यह जरूरी नहीं है कि उस चरित्र का प्रतिनिधित्व करने के लिए कितने बिट्स हैं। एन्कोडिंग वर्णों का प्रतिनिधित्व करने के लिए "अधिक कॉम्पैक्ट" तरीके नहीं हैं, वे ** ** वर्णों का प्रतिनिधित्व करने के तरीके हैं। देखें https://www.joelonsoftware.com/2003/10/08/the-absolute-minimum-every-software-developer-absolutely-positively-must-now-about-unicode-and-character-sets-no-excuses/ – Len

-1

आप उन लोगों के लिए सही हैं:
... कि str [3] जरूरी 4 चरित्र को इंगित नहीं करता है ... केवल उन्हें डमी सुविधा कम बाइट एरेस का उपयोग इसका मतलब है ...

सी ++ की स्ट्रिंग केवल एसीआईआई अक्षरों को संभाल सकती है। यह जावा की स्ट्रिंग से अलग है, जो यूनिकोड वर्णों को संभाल सकता है। आप स्ट्रिंग में चीनी अक्षरों के एन्कोडिंग परिणाम (बाइट्स) को स्टोर कर सकते हैं (सी/सी ++ में चार केवल बाइट है), लेकिन यह अर्थहीन है क्योंकि स्ट्रिंग केवल बाइट्स को एसीआई चार्स के रूप में मानती है, इसलिए आप इसे संसाधित करने के लिए स्ट्रिंग फ़ंक्शन का उपयोग नहीं कर सकते हैं।
wstring आपको कुछ चाहिए जो हो सकता है।

कुछ ऐसा है जिसे स्पष्ट किया जाना चाहिए। यूटीएफ -8 यूनिकोड वर्णों के लिए सिर्फ एक एन्कोडिंग विधि है (वर्णों को/से बाइट प्रारूप में बदलना)।

+0

आपके उत्तर के लिए धन्यवाद। मैं क्या जानना चाहता था कि यूटीएफ -8 एन्कोडेड टेक्स्ट का उपयोग करते समय स्ट्रिंग क्लास के कौन से तरीके अभी भी काम करेंगे। – Virus721

+0

-1 'std :: string' स्टोर्स' char'। लेकिन इसका मतलब यह नहीं है कि यह एएससीआईआई तक ही सीमित है, इसका मतलब है कि यह एन्कोडिंग के बारे में कुछ भी नहीं जानता है, इसलिए आप इसे किसी भी एन्कोडिंग के लिए उपयोग कर सकते हैं (और यदि आप सावधान नहीं हैं तो इसके परिणामस्वरूप सब कुछ पेंच कर सकते हैं)। और जावा की स्ट्रिंग एक यूटीएफ -16 सरणी है, इसलिए 'str [3] 'चौथा कोड बिंदु आवश्यक नहीं है। – delnan

+0

@delnan कृपया मेरे उत्तर के माध्यम से पूरी तरह से जाने के बाद नीचे वोट दें। मैंने यह कहा है "आप चीनी वर्णों के एन्कोडिंग परिणाम (बाइट्स) को स्ट्रिंग में रख सकते हैं (सी/सी ++ में चार केवल बाइट है), लेकिन यह अर्थहीन है क्योंकि स्ट्रिंग केवल बाइट्स को एसीआई चार्स के रूप में मानती है, इसलिए आप स्ट्रिंग फ़ंक्शन का उपयोग नहीं कर सकते इसे संसाधित करने के लिए। "मैंने कहा" सी ++ की स्ट्रिंग केवल एसीआईआई अक्षरों को संभाल सकती है। " नहीं "सी ++ की स्ट्रिंग केवल एसीआईआई अक्षरों को स्टोर कर सकती है।" हैंडल स्टोर से अलग है। जब आप इसे बाइट्स स्टोर करने के लिए उपयोग करते हैं तो स्ट्रिंग फ़ंक्शंस व्यर्थ हो जाएगा, इसलिए मैंने हैंडल का उपयोग किया। धन्यवाद। – JackyZhu

2

आप यूनिकोड को std :: स्ट्रिंग या मानक लाइब्रेरी से किसी अन्य टूल के साथ संभाल नहीं सकते हैं। बाहरी पुस्तकालय का उपयोग करें जैसे कि: http://utfcpp.sourceforge.net/

+0

धन्यवाद, मुझे एक नज़र आएगी। – Virus721

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