2011-03-13 15 views
7

मेरा सी ++ प्रोजेक्ट वर्तमान में कोड की लगभग 16 के लाइनों की बड़ी है, और मैं पूरी तरह से यूनिकोड समर्थन के बारे में पूरी तरह से सोचा नहीं मानता हूं।सी ++: मेरा प्रोजेक्ट समर्थन यूनिकोड

मैंने जो कुछ किया है वह std::stringString के रूप में एक कस्टम टाइपपीफ था और कोडिंग में कूद गया।

मैंने कभी भी मेरे द्वारा लिखे गए कार्यक्रमों में यूनिकोड के साथ वास्तव में काम नहीं किया है।

  • अब मेरी परियोजना को यूनिकोड में स्विच करना कितना मुश्किल है? क्या यह भी एक अच्छा विचार है?

  • क्या मैं किसी भी बड़ी समस्या के बिना std::wchar पर स्विच कर सकता हूं?

+2

std :: wchar यूनिकोड के बराबर नहीं है। – Erik

+0

@Erik: अब, अगर केवल माइक्रोसॉफ्ट अपने दस्तावेज को प्रतिबिंबित करने के लिए बदल देगा ... – dan04

उत्तर

7

शायद एक आवेदन यूनिकोड जागरूक बनाने का सबसे महत्वपूर्ण हिस्सा अपने तार की एन्कोडिंग ट्रैक करने के लिए और सुनिश्चित करें कि आपके सार्वजनिक इंटरफेस अच्छी तरह से निर्दिष्ट कर रहे हैं कि और आसान एन्कोडिंग है कि आप उपयोग करना चाहते हैं के साथ उपयोग करने के लिए बनाने के लिए है।

एक व्यापक चरित्र पर स्विचिंग (सी ++ wchar_t में) आवश्यक समाधान नहीं है। वास्तव में, मैं कहूंगा कि यह आमतौर पर सबसे आसान समाधान नहीं है। कुछ एप्लिकेशन यह निर्दिष्ट करने से दूर हो सकते हैं कि सभी तार और इंटरफेस यूटीएफ -8 का उपयोग करते हैं और उन्हें बदलने की जरूरत नहीं है। std::string यूटीएफ -8 एन्कोडेड तारों के लिए पूरी तरह से उपयोग किया जा सकता है।

हालांकि, यदि आपको गैर-यूटीएफ -8 इंटरफेस के साथ स्ट्रिंग या इंटरफ़ेस में वर्णों की व्याख्या करने की आवश्यकता है तो आपको अधिक काम करना होगा लेकिन आपके आवेदन के बारे में और जानने के बिना, एक सर्वोत्तम दृष्टिकोण की सिफारिश करना असंभव है ।

2

std::wstring का उपयोग करने के साथ कुछ समस्याएं हैं। यदि आपका एप्लिकेशन यूनिकोड में टेक्स्ट संग्रहीत करेगा, और यह विभिन्न प्लेटफ़ॉर्म पर चल रहा होगा, तो आप परेशानी में भाग सकते हैं। std::wstringwchar_t पर निर्भर करता है, जो संकलक निर्भर है। माइक्रोसॉफ्ट विजुअल सी ++ में, यह प्रकार 16 बिट चौड़ा है, और इस प्रकार केवल यूटीएफ -16 एन्कोडिंग का समर्थन करेगा। जीएनयू सी ++ कंपाइलर इस प्रकार को 32 बिट चौड़ा मानता है, और इस प्रकार केवल यूटीएफ -32 एन्कोडिंग का समर्थन करेगा। यदि आप टेक्स्ट को एक सिस्टम से फ़ाइल में संग्रहीत करते हैं (विंडोज/वीसी ++ कहते हैं), और उसके बाद फ़ाइल को किसी अन्य सिस्टम (लिनक्स/जीसीसी) से पढ़ें, तो आपको इसके लिए तैयार करना होगा (इस मामले में यूटीएफ -16 से कनवर्ट करें UTF-32)।

+0

"यह प्रकार 16 बिट चौड़ा है, और इस प्रकार केवल यूटीएफ -16 एन्कोडिंग का समर्थन करेगा"। यह गलत है। निश्चित चौड़ाई 16 बिट चार के विपरीत, यूटीएफ -16 * * 2^16 से अधिक कोड कोड का समर्थन करता है। –

+0

मैं कोड बिंदुओं के बारे में बात नहीं कर रहा हूं, मैं कोड बिंदुओं के एन्कोडिंग के बारे में बात कर रहा हूं। मुझे लगता है कि आप यूसीएस -2 के साथ यूटीएफ -16 को भ्रमित कर रहे हैं। यदि नहीं, तो मुझे नहीं पता कि आप किस बारे में बात कर रहे हैं। –

+0

मेरा बुरा, मैंने गलत समझा कि 'केवल यूटीएफ -16 एन्कोडिंग का समर्थन करें'। –

1

क्या मैं किसी भी बड़ी समस्या के बिना [std::wchar_t] पर स्विच कर सकता हूं?

नहीं, यह इतना आसान नहीं है।

  • wchar_t स्ट्रिंग का एन्कोडिंग प्लेटफॉर्म-निर्भर है। विंडोज यूटीएफ -16 का उपयोग करता है। लिनक्स आमतौर पर यूटीएफ -32 का उपयोग करता है। (सी ++ 0 एक्स अलग-अलग char16_t और char32_t प्रकारों को शुरू करके इस अंतर को कम करेगा।)
  • यदि आपको यूनिक्स-जैसी प्रणालियों का समर्थन करने की आवश्यकता है, तो आपके पास विंडोज़ के सभी यूटीएफ -16 फ़ंक्शन नहीं हैं, इसलिए आप चाहते हैं अपना खुद का _wfopen, आदि लिखने की आवश्यकता है
  • क्या आप किसी तीसरे पक्ष के पुस्तकालयों का उपयोग करते हैं? पर समर्थन wchar_t?
  • हालांकि विस्तृत वर्णों के एक में स्मृति प्रतिनिधित्व के लिए सामान्य रूप से उपयोग किया जाता है, पर-डिस्क और on-the-Web प्रारूपों ज्यादा अधिक UTF-16/32 की तुलना में UTF-8 (या अन्य char आधारित एन्कोडिंग) होने की संभावना है। आपको इन्हें बदलना होगा।
  • तुम बस खोज एवं प्रतिस्थापन नहीं कर सकते wchar_t साथ char क्योंकि सी ++ घालमेल कर दिया है "चरित्र" और "बाइट", और आप निर्धारित करने के लिए जो char रों अक्षर और जो char s बाइट हैं हैं।
संबंधित मुद्दे