2010-02-24 18 views
16

में इसके साथ काम कर रहा है मान लीजिए कि हमारे पास मनमाने ढंग से स्ट्रिंग है, sयूनिकोड - आमतौर पर सी ++

एस की दुनिया में कहीं भी होने की संपत्ति है। संयुक्त राज्य अमेरिका, जापान, कोरिया, रूस, चीन और ग्रीस के लोग समय-समय पर s में लिखते हैं। सौभाग्य से हमारे पास रैखिक ए का उपयोग कर समय यात्रियों नहीं हैं। में

  • रिवर्स
  • लंबाई
  • भुनाने
  • लोअरकेस
  • सूचकांक:

    चर्चा की के लिए, का अनुमान हम इस तरह के रूप में स्ट्रिंग आपरेशन करने के लिए चाहते हैं

    और, सिर्फ इसलिए कि यह चर्चा के लिए है, मान लीजिए कि हम इन दिनोंचर्या (पुस्तकालय को पकड़ने के बजाए) लिखना चाहते हैं, और हमारे पास बनाए रखने के लिए कोई विरासत सॉफ्टवेयर नहीं है।

    यूनिकोड के लिए 3 मानक हैं: utf-8, utf-16, और utf-32, प्रत्येक पेशेवर और विपक्ष के साथ। लेकिन मान लीजिए कि मैं सॉर्टा गूंगा हूं, और मैं चाहता हूं कि एक यूनिकोड उन सभी पर शासन करे (क्योंकि गतिशील रूप से अनुकूलन लाइब्रेरी को 3 अलग-अलग प्रकार के स्ट्रिंग एन्कोडिंग के लिए रोल करना जो एपीआई उपयोगकर्ता से अंतर को छुपाता है)।

    • कौन सा एन्कोडिंग सबसे सामान्य है?
    • कौन सा एन्कोडिंग wchar_t द्वारा समर्थित है?
    • एसटीएल द्वारा कौन सा एन्कोडिंग समर्थित है?
    • क्या ये एन्कोडिंग सभी (या बिल्कुल नहीं) शून्य-समाप्त हो गई हैं?

    -

    इस सवाल की बात अपने आप को और दूसरों को यूनिकोड के लिए उपयोगी और उपयोगी जानकारी में शिक्षित करने के लिए है: RFC के पढ़ने ठीक है, लेकिन वहाँ एक compilers, भाषाओं से संबंधित जानकारी के 'ढेर' है , और ऑपरेटिंग सिस्टम जो आरएफसी कवर नहीं करते हैं, लेकिन वास्तविक ऐप में वास्तव में यूनिकोड का उपयोग करने के बारे में जानना महत्वपूर्ण है।

+0

बिल्कुल एक डुप्ली नहीं बल्कि http://stackoverflow.com/questions/114611/what-is-the-best-unicode-library-for-c –

+0

@ मार्टिन: मुझे वास्तव में दिलचस्पी नहीं है - इस पर समय - सबसे अच्छी लाइब्रेरी क्या है। यूनिकोड में सामान्य रूप से यूनिकोड के बारे में जानकारी के साथ और मैं एक रिवर्स - या संभवतः एक अधिक अस्पष्ट दिनचर्या लिखने के बारे में कैसे सोचूंगा, इस बारे में और अधिक दिलचस्पी लेता हूं - यूनिकोड में और इसे उड़ाने में नहीं, तुर्की कहें। :-) –

+0

हां यही कारण है कि मैंने डुप्ली के रूप में बंद नहीं किया, लेकिन कोई भी जो इस प्रश्न को पाता है वह सिर्फ लाइब्रेरी का उपयोग करने में रूचि रख सकता है। अगर इस धागे को अच्छे जवाब मिलते हैं तो मैं इसे दूसरे धागे में संदर्भित कर दूंगा। –

उत्तर

9
  1. कौन सा एन्कोडिंग, सबसे सामान्य
    शायद UTF-32 है, हालांकि सभी तीन स्वरूपों किसी भी चरित्र स्टोर कर सकते हैं। यूटीएफ -32 में संपत्ति है कि प्रत्येक चरित्र को एक कोडपॉइंट में एन्कोड किया जा सकता है।

  2. कौन सा एन्कोडिंग wchar_t
    कोई भी द्वारा समर्थित है। यह कार्यान्वयन परिभाषित किया गया है। अधिकांश विंडोज प्लेटफॉर्म पर यह यूटीएफ -16 है, अधिकांश यूनिक्स प्लेटफार्मों पर इसकी यूटीएफ -32।

  3. कौन सा एन्कोडिंग एसटीएल
    कोई नहीं वास्तव में द्वारा समर्थित है।एसटीएल स्टोर किसी भी प्रकार का चरित्र चाह सकता है। बस std::basic_string<t> टेम्पलेट का उपयोग अपने कोड बिंदु को पकड़ने के लिए पर्याप्त प्रकार के साथ करें। अधिकांश ऑपरेशंस (उदा। std::reverse) यद्यपि किसी भी प्रकार के यूनिकोड एन्कोडिंग के बारे में नहीं जानते हैं।

  4. क्या ये एन्कोडिंग सभी (या बिल्कुल नहीं) शून्य-समाप्त हो गई हैं?
    नं। नल उन किसी भी एन्कोडिंग में कानूनी मान है। तकनीकी रूप से, एनएलएलआई भी सादा ASCII में एक कानूनी चरित्र है। पूर्ण समाप्ति एक सी चीज है - एक एन्कोडिंग चीज नहीं।

यह चुनना कि आपके प्लेटफ़ॉर्म के साथ ऐसा करने के लिए बहुत कुछ करना है। यदि आप विंडोज़ पर हैं, तो यूटीएफ -16 और wchar_t तारों का उपयोग करें, क्योंकि विंडोज एपीआई यूनिकोड का समर्थन करने के लिए उपयोग करता है। मुझे पूरी तरह से यकीन नहीं है कि यूनिक्स प्लेटफॉर्म के लिए सबसे अच्छा विकल्प क्या है लेकिन मुझे पता है कि उनमें से अधिकतर यूटीएफ -8 का उपयोग करते हैं।

+2

यूटीएफ -32 के साथ भी आप प्रत्येक चरित्र को एक कोडपॉइंट के रूप में स्टोर नहीं कर सकते हैं। वह एन्कोडिंग केवल कोड इकाइयों और कोड बिंदुओं के बीच 1: 1 मैपिंग सुनिश्चित करता है (शब्दावली पर विवरण के लिए, unicode.org देखें) –

+0

एर .. वास्तव में, यह कर सकता है। यूनिकोड को पात्रों के पूर्ण सेट के लिए 21 बिट्स की आवश्यकता होती है। यूटीएफ -32 एक कोडपॉइंट में 32 बिट्स प्रदान करता है। अक्षरों को कभी भी यूटीएफ -32 पर विभाजित होने की आवश्यकता नहीं है। आप यूटीएफ -16 के बारे में सोच रहे हैं। –

+3

आप यहाँ कोड बिंदुओं के बारे में बात कर रहे हैं, चरित्र नहीं। एन्कोडिंग के बावजूद, कुछ (वास्तव में कई) वर्णों को एकाधिक कोड बिंदुओं के साथ वर्णित करने की आवश्यकता है।उदाहरण के लिए, इस लिंक पर एक नज़र डालें: http://www.unicode.org/faq/char_combmark.html –

5

ओपन सोर्स लाइब्रेरी ICU पर विशेष रूप से Docs & Papers section पर एक नज़र डालें। यह यूनिकोड विषमता के सभी प्रकार से निपटने वाली एक व्यापक पुस्तकालय है।

+1

ओपी ने स्पष्ट रूप से गैर-पुस्तकालय उत्तर के लिए कहा। –

+2

यही कारण है कि मैंने उनके डॉक्स और पेपर अनुभाग को संदर्भित किया। यदि ओपी गंभीरता से यूनिकोड हैंडलिंग के बारे में जानना चाहता है, तो उसे मौजूदा समाधानों को देखने से बचना नहीं चाहिए। आईसीयू न केवल उत्पादन ग्रेड स्रोत कोड प्रदान करता है, बल्कि दस्तावेजों को भी डिजाइन करता है। –

+0

आह - मैं देखता हूं। फिर +1। –

1

"असली एप्लिकेशन" :) परिभाषित

गंभीरता से, निर्णय वास्तव में सॉफ्टवेयर की तरह आप विकसित कर रहे हैं पर बहुत कुछ निर्भर करता है। यदि आपका लक्ष्य प्लेटफार्म Win32 API है (एमएफसी, डब्ल्यूटीएल, आदि जैसे रैपर के साथ या बिना) तो आप शायद यूटीएफ -16 के रूप में एन्कोड किए गए टेक्स्ट के साथ wstring प्रकारों का उपयोग करना चाहते हैं। ऐसा इसलिए है क्योंकि सभी Win32 API आंतरिक रूप से उस एन्कोडिंग का उपयोग करता है।

दूसरी तरफ, यदि आपका आउटपुट एक्सएमएल/एचटीएमएल और/या इंटरनेट पर वितरित करने की जरूरत है, तो यूटीएफ -8 काफी मानक है - यह आमतौर पर प्रोटोकॉल के माध्यम से संचारित होता है जो वर्णों के बारे में धारणा करता है 8 बिट्स

यूटीएफ -32 के लिए, मैं इसका उपयोग करने के एक कारण के बारे में नहीं सोच सकता, जब तक आपको कोड इकाइयों और कोड बिंदुओं के बीच 1: 1 मैपिंग की आवश्यकता न हो (जो अभी भी कोड इकाइयों के बीच 1: 1 मैपिंग का मतलब नहीं है और वर्ण!)।

अधिक जानकारी के लिए, Unicode.org को देखना सुनिश्चित करें। This FAQ एक अच्छा प्रारंभिक बिंदु हो सकता है।

+0

एक बात मैं इस पर स्पष्ट नहीं हूं: क्या यूटीएफ एन्कोडिंग में से कोई भी आज सभी जीवित भाषा लेखनों में उपयोग किए जाने वाले सभी ग्लिफ का प्रतिनिधित्व कर सकता है? यही है, अगर मैं यूटीएफ -8 या यूटीएफ -16 का चयन करता हूं, तो क्या मैं खुद को कुछ बाजारों से बाहर कर दूंगा? –

+2

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

2

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

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