2012-03-08 19 views
9

विंडोज एपीआई UNICODE पर बड़ा लगता है, आप विजुअल सी ++ में एक नई परियोजना बनाते हैं और यह डिफ़ॉल्ट रूप से UNICODE पर सेट करता है।
और मैं एक अच्छा विंडोज प्रोग्रामर बनने की कोशिश कर रहा हूं, मैं UNICODE का उपयोग करना चाहता हूं।सी ++ यूनिकोड और एसटीएल

समस्या सी ++ मानक पुस्तकालय और है एसटीएल UNICODE तार के साथ अच्छी तरह से काम नहीं करते हैं (जैसे कि std :: स्ट्रिंग, या std :: runtime_error के रूप में)। मैं केवल एक std :: स्ट्रिंग, या एक char* एसटीडी करने के लिए :: runtime_error पारित कर सकते हैं, और मैं यकीन है कि std :: स्ट्रिंगUNICODE का समर्थन नहीं करता हूँ।

तो मेरा सवाल यह है कि, मुझे std :: runtime_error जैसी चीज़ों का उपयोग कैसे करना चाहिए? क्या मुझे UNICODE और नियमित ANSI मिश्रण करना चाहिए? (मुझे लगता है कि यह एक बुरा विचार है ...)
बस मेरी पूरी परियोजना में ANSI का उपयोग करें? (पसंद नहीं ..) या क्या?

+2

वे अपवाद हैं, क्या आपको लगता है कि आपको उन्हें अंतर्राष्ट्रीयकृत करने की आवश्यकता है और वास्तव में उनके लिए यूनिकोड समर्थन की आवश्यकता है? – PlasmaHH

+0

आप ज्यादातर 'std :: wstring' का उपयोग कर सकते हैं। 'std :: runtime_error' एक दुर्भाग्यपूर्ण अपवाद है (कोई पन इरादा नहीं है!)। – arx

+1

संभावित डुप्लिकेट [यूनिकोड के साथ अपवाद क्या()] (http: // stackoverflow।कॉम/प्रश्न/3760731/अपवाद-साथ-यूनिकोड-क्या) –

उत्तर

9

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

तो यदि आप अपने पूरे उपयोगकर्ता के सामने वाले इंटरफ़ेस के लिए UNICODE का उपयोग करते हैं और अभी भी std::exception आदि का उपयोग डेवलपर संदेशों के दृश्यों के पीछे करते हैं तो आप सुरक्षित पक्ष पर हैं। दोनों के बीच बदलने के लिए कभी भी आवश्यकता नहीं होनी चाहिए।

इसके अलावा, यह ++ एक typedefUNICODE के लिए सी में स्वतंत्र तार परिभाषित करने के लिए एक अच्छा चाल है:

typedef std::basic_string<TCHAR> tstring; 

... और तुलनात्मक रूप से tcout, tcin आदि सशर्त परिभाषित:

#ifdef UNICODE 
    std::wostream& tcout = std::wcout; 
    std::wostream& tcerr = std::wcerr; 
    std::wostream& tclog = std::wclog; 
    std::wistream& tcin = std::wcin; 
#else 
    std::ostream& tcout = std::cout; 
    std::ostream& tcerr = std::cerr; 
    std::ostream& tclog = std::clog; 
    std::istream& tcin = std::cin; 
#endif 
+3

मुझे लगता है कि लॉग फाइलों जैसे मामलों के लिए एक तर्क है, आप यूनिकोड तारों का उपयोग करना चाहिए। लॉग फाइलें अक्सर उपयोगकर्ता डेटा को सिस्टम डेटा और उपयोगकर्ता डेटा के साथ मिश्रित करती हैं, शायद यूनिकोड सामग्री शामिल हो सकती है। आप हमेशा एएनएसआई अपवाद मान सकते हैं, लेकिन एक अच्छा अपवाद में फ़ाइल पथ शामिल हो सकता है (फ़ाइल के लिए अपवाद नहीं मिलता है) और उस पथ में यूनिकोड वर्ण शामिल हो सकते हैं)। –

+0

टाइपपीफ चाल के लिए ठोकरें। लेकिन क्या होगा यदि मैं समस्याओं को रिपोर्ट/पहचानने के लिए उपयोगकर्ता को त्रुटि संदेशों को प्रदर्शित करना चाहता हूं? संपादित करें: जिम लैम्ब ने जो कुछ कहा वह बहुत ज्यादा है। – Josh

+0

@Jim True point। मैंने ईमानदारी से यह नहीं माना था। –

0

विंडोज यूनिकोड एपीआई के साथ काम करने के लिए, बस विस्तृत स्ट्रिंग संस्करणों का उपयोग करें - wstring, आदि। यह exception::what() के साथ मदद नहीं करेगा, लेकिन इसके लिए यदि आप वास्तव में यूनिकोड की आवश्यकता है तो आप यूटीएफ -8 एन्कोडिंग का उपयोग कर सकते हैं।

1

एक नजर डालें CodeProject पर इस (बल्कि पुराना अब) आलेख पर: Upgrading an STL-based application to use Unicode। यदि आप एसटीएल का व्यापक रूप से उपयोग कर रहे हैं तो इसमें उन मुद्दों को शामिल किया गया है जिन्हें आप हिट करने की संभावना रखते हैं। यह बुरा नहीं होना चाहिए और, आम तौर पर बोलना, व्यापक तारों का उपयोग करने के लिए आपके समय के लायक है।

+1

हम्म, यह आलेख बेहद पुराना है। उदाहरण के लिए, यह कहता है कि 'wchar_t'' हस्ताक्षरित शॉर्ट 'का एक टाइपिफ़ है जो ओवरलोडिंग समस्याओं का कारण बनता है। यह आधुनिक कंपाइलर्स पर सच नहीं है। –

2

जोश,

कृपया मेरा उत्तर यहाँ पर एक नजर है: https://softwareengineering.stackexchange.com/questions/102205/should-utf-16-be-considered-harmful

इंजीनियरों का मानना ​​है std :: स्ट्रिंग विंडोज पर यूनिकोड के लिए बिल्कुल सटीक है की बढ़ती संख्या है, और करने के लिए सही तरीका है पोर्टेबल और यूनिकोड-सही प्रोग्राम तेजी से लिखें।

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