2012-03-18 15 views
10

लोकप्रिय सॉफ्टवेयर डेवलपर्स और कंपनियों (Joel Spolsky, Fog Creek software) का सही उपयोग जब सी या सी ++ कोड लिखने यूनिकोड वर्ण भंडारण के लिए wchar_t इस्तेमाल करते हैं। अच्छी कोडिंग प्रथाओं के संबंध में char और wchar_t का उपयोग कब और कैसे किया जाना चाहिए?सी में स्ट्रिंग भंडारण और सी ++

मुझे विशेष रूप से POSIX अनुकरण में यूनिकोड का लाभ उठाने वाले सॉफ़्टवेयर लिखने में अनुपालन है।

जब wchar_t का उपयोग कर, आप पात्रों विस्तृत वर्णों की एक सरणी में एक प्रति-चरित्र या प्रति-सरणी तत्व के आधार पर देख सकते हैं:

/* C code fragment */ 
const wchar_t *overlord = L"ov€rlord"; 
if (overlord[2] == L'€') 
    wprintf(L"Character comparison on a per-character basis.\n"); 

आप यूनिकोड बाइट्स की तुलना कैसे कर सकते हैं (या अक्षर) char का उपयोग करते समय?

अब तक सी में तार और प्रकार चार के पात्रों की तुलना में मेरी पसंदीदा तरीका अक्सर इस तरह दिखता है:

/* C code fragment */ 
const char *mail[] = { "ov€[email protected]", "ov€[email protected]" }; 
if (mail[0][2] == mail[1][2] && mail[0][3] == mail[1][3] && mail[0][3] == mail[1][3]) 
    printf("%s\n%zu", *mail, strlen(*mail)); 

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

इसके अलावा, wchar_t का उपयोग करते समय, आप फ़ाइल सामग्री को सरणी में कैसे स्कैन कर सकते हैं? फ़ंक्शन फ़्रेड मान्य परिणाम उत्पन्न नहीं करता प्रतीत होता है।

+9

सी ++ में यूनिकोड: 'wchar_t' का उपयोग न करें, उचित यूनिकोड लाइब्रेरी का उपयोग करें। –

+3

'यूनिकोड वर्ण एन्कोडिंग के लिए wchar_t का उपयोग करते हैं। नहीं; वे यूनिकोड चरित्र _storage_ के लिए इसका उपयोग करते हैं, और इसमें एक बड़ा अंतर है। –

+0

[एसडीडी :: wstring वीएस std :: स्ट्रिंग] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring) –

उत्तर

10

यदि आप जानते हैं कि आप यूनिकोड से निपट रहे हैं, न तो char और न ही wchar_t उचित हैं क्योंकि उनके आकार कंपाइलर/प्लेटफ़ॉर्म-परिभाषित हैं। उदाहरण के लिए, wchar_t विंडोज (एमएसवीसी) पर 2 बाइट्स है, लेकिन लिनक्स (जीसीसी) पर 4 बाइट्स हैं। सी 11 और सी ++ 11 मानकों में थोड़ा अधिक कठोर रहा है, और यूटीएफ- {8, 16, 32} स्ट्रिंग बनाने के लिए संबंधित दोहराए गए उपसर्गों के साथ दो नए चरित्र प्रकार (char16_t और char32_t) को परिभाषित किया गया है।

यदि आपको यूनिकोड वर्णों को स्टोर और हेरफेर करने की आवश्यकता है, तो आपको नौकरी के लिए डिज़ाइन की गई लाइब्रेरी का उपयोग करना चाहिए, न कि पूर्व-सी 11 और न ही प्री-सी ++ 11 भाषा मानकों को यूनिकोड के साथ दिमाग में लिखा गया है। few to choose from हैं, लेकिन ICU काफी लोकप्रिय है (और सी, सी ++, और जावा का समर्थन करता है)।

+3

यहां तक ​​कि सी ++ 11 यूनिकोड सामान पर काफी हल्का है। Utf8/16/32 के बीच कुछ प्रकार और मानक रूपांतरणों को अनिवार्य करने से परे आपको कोलेक्शन, तुलना, सामान्यीकरण इत्यादि जैसी कोई चीज़ नहीं मिलेगी। –

+0

बस एक अतिरिक्त के रूप में, मुझे लगता है कि सी 11 यहां सी ++ 1 के साथ सिंक होने की कोशिश करता है और एक ही नया 'char ?? _ t' प्रकार पेश करता है। –

+0

हां, सी 11 इन प्रकारों/शाब्दियों के लिए सी ++ 11 के साथ सिंक हो रहा है। –

0

मैं विशेष रूप से में POSIX अनुपालन दिलचस्पी है जब सॉफ्टवेयर कि यूनिकोड का लाभ उठाता है लेखन।

इस मामले में, आप शायद अपने पसंदीदा यूनिकोड स्ट्रिंग प्रकार के रूप में यूटीएफ -8 (char के साथ) का उपयोग करना चाहेंगे।POSIX में wchar_t — के साथ काम करने के लिए बहुत सारे फ़ंक्शन नहीं हैं जो अधिकतर विंडोज़ चीज है।

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

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

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

0

स्ट्रिंग बराबर हैं या नहीं, यह तय करने के लिए आपको बाइट्स या यहां तक ​​कि कोड बिंदुओं की तुलना कभी नहीं करना चाहिए। ऐसा इसलिए है क्योंकि बहुत से तार कोड बिंदु परिप्रेक्ष्य के समान होने के बिना उपयोगकर्ता परिप्रेक्ष्य से समान हो सकते हैं।

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