2008-12-01 18 views
44

सी ++ स्रोत कोड का मानक एन्कोडिंग क्या है? क्या सी ++ मानक इसके बारे में कुछ भी कहता है? क्या मैं यूनिकोड में सी ++ स्रोत लिख सकता हूं?सी ++ स्रोत कोड में यूनिकोड का उपयोग

उदाहरण के लिए, क्या मैं टिप्पणियों में चीनी वर्णों जैसे गैर-ASCII वर्णों का उपयोग कर सकता हूं? यदि हां, तो पूर्ण यूनिकोड की अनुमति है या यूनिकोड का बस एक उप-समूह है? (उदाहरण के लिए, वह 16-बिट पहला पृष्ठ या जिसे भी कहा जाता है।)

इसके अलावा, क्या मैं स्ट्रिंग के लिए यूनिकोड का उपयोग कर सकता हूं? उदाहरण के लिए:

Wstring str=L"Strange chars: â Țđ ě €€"; 
+0

* आरई: "जिसे भी कहा जाता है": * [विकिपीडिया से] (https://en.wikipedia.org/wiki/Plane_%28Unicode%29#Basic_Multilingual_Plane): पहला विमान, ** विमान 0 **, ** बेसिक बहुभाषी विमान (बीएमपी) ** में लगभग सभी आधुनिक भाषाओं के लिए वर्ण हैं, और बड़ी संख्या में प्रतीकों हैं। बीएमपी का प्राथमिक उद्देश्य पूर्व चरित्र सेट के साथ-साथ लेखन के पात्रों के एकीकरण का समर्थन करना है। बीएमपी में दिए गए अधिकांश कोड बिंदुओं का उपयोग ** चीनी **, ** जापानी **, और ** कोरियाई (सीजेके) ** अक्षरों को एन्कोड करने के लिए किया जाता है। – DavidRR

उत्तर

33

सी ++ में एन्कोडिंग काफी जटिल है। यहां मेरी समझ है।

प्रत्येक कार्यान्वयन को मूल स्रोत वर्ण सेट से वर्णों का समर्थन करना है। इनमें §2.2/1 (§2.3/1 सी ++ 11 में सूचीबद्ध) में सूचीबद्ध सामान्य वर्ण शामिल हैं। इन पात्रों को सभी को char में फिट होना चाहिए। इसके अलावा कार्यान्वयन को universal-character-names नामक तरीके से अन्य वर्णों का नाम देने का एक तरीका है और \uffff या \Uffffffff जैसा दिखता है और यूनिकोड वर्णों के संदर्भ में उपयोग किया जा सकता है। उनमें से एक उप-समूह पहचानकर्ताओं में उपयोग योग्य है (अनुलग्नक ई में सूचीबद्ध)।

यह सब अच्छा है, लेकिन फ़ाइल में वर्णों से मैपिंग, स्रोत वर्णों (संकलन समय पर उपयोग किया जाता है) को क्रियान्वयन परिभाषित किया गया है। यह इस्तेमाल एन्कोडिंग का गठन करता है।

शारीरिक स्रोत फ़ाइल पात्रों , मैप किए गए एक कार्यान्वयन से परिभाषित ढंग से मूल स्रोत चरित्र सेट करने के लिए, कर रहे हैं (नई लाइन पात्रों शुरू: यहाँ यह क्या कहते हैं सचमुच (सी ++ 98 संस्करण) अंतराल संकेतकों के लिए) यदि आवश्यक है। ट्रिग्राफ अनुक्रम (2.3) को सिंगल-कैरेक्टर आंतरिक प्रस्तुतियों द्वारा प्रतिस्थापित किया गया है। किसी भी स्रोत फ़ाइल मूल स्रोत वर्ण सेट (2.2) में वर्ण नहीं है सार्वभौमिक-वर्ण-नाम द्वारा प्रतिस्थापित किया गया है जो des- उस वर्ण को अनदेखा करता है।(एक कार्यान्वयन स्रोत फ़ाइल में आई एक वास्तविक विस्तारित चरित्र के रूप में इतने लंबे समय के किसी भी आंतरिक एन्कोडिंग का उपयोग कर सकते हैं, और एक ही विस्तारित चरित्र यानी एक सार्वभौमिक-चरित्र-नाम के रूप में स्रोत फ़ाइल में व्यक्त (का उपयोग करते हुए \ uXXXX अंकन), समतुल्य रूप से नियंत्रित किया जाता।)

जीसीसी के लिए, आप यह विकल्प -finput-charset=charset का उपयोग कर बदल सकते हैं। इसके अतिरिक्त, आप निष्पादन वर्ण को रनटाइम पर मान रीसेट करने के लिए उपयोग कर सकते हैं। इसके लिए उचित विकल्प -fexec-charset=charset char के लिए है (यह utf-8 पर डिफ़ॉल्ट है) और -fwide-exec-charset=charset (जो utf-16 या utf-32 पर wchar_t के आकार के आधार पर डिफ़ॉल्ट है)।

9

सी ++ मानक स्रोत कोड कोड एन्कोडिंग के बारे में कुछ भी नहीं कहता है, जहां तक ​​मुझे पता है।

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

संपादित करें: ऐसा लगता है कि माइक्रोसॉफ्ट के compilers स्वीकार करेंगे यूनिकोड एन्कोड फ़ाइलें, लेकिन कभी कभी भी 8-बिट ASCII पर त्रुटियों का उत्पादन करेगा: स्ट्रिंग्स में

warning C4819: The file contains a character that cannot be represented 
in the current code page (932). Save the file in Unicode format to prevent 
data loss. 
+0

यह तरह करता है। मुझे नहीं लगता कि यह स्पष्ट रूप से रोकता है या यूनिकोड की अनुमति देता है, लेकिन यह न्यूनतम स्वीकार्य चरित्र सेट है: http://www.csci.csusb.edu/dick/c++std/cd2/lex.html#lex.charset –

+0

सी ++ बिल्डर 2007 के बाद से, बोर्लैंड/कोडेगियर कंपाइलर ने यूनिकोड स्रोत फ़ाइलों का समर्थन किया है: यानी यूनिकोड स्ट्रिंग अक्षर, यूनिकोड टिप्पणियां। आईडीई ने उनके साथ थोड़ा संघर्ष किया है, लेकिन संकलक खुश है! – Roddy

+0

मैंने जो बोर्लैंड चीज का उल्लेख किया वह लगभग बीस साल पहले था (आखिरी बार मैंने स्रोत-कोड फ़ाइल में उच्च-ASCII चरित्र डालने का प्रयास किया था)। :-) मैंने लगभग दस वर्षों में बोर्लैंड कंपाइलर का उपयोग नहीं किया है। –

3

एन्कोडिंग के लिए मुझे लगता है कि आप का उपयोग करने के लिए हैं \ यू अंकन, जैसे:

std::wstring str = L"\u20AC"; // Euro character 
0

AFAIK यह मानकीकृत के रूप में आप विस्तृत तार में वर्णों की किसी भी प्रकार के रख सकते हैं नहीं है। आपको बस यह जांचना होगा कि आपका कंपाइलर यूनिकोड स्रोत कोड पर सेट है ताकि यह सही काम कर सके।

2

यह भी ध्यान देने योग्य है कि सी ++ में विस्तृत वर्ण वास्तव में यूनिकोड तार नहीं हैं। वे आमतौर पर बड़े पात्रों के तार होते हैं, आमतौर पर 16, लेकिन कभी-कभी 32 बिट्स। यह कार्यान्वयन-परिभाषित है, हालांकि, आईआईआरसी में आपके पास 8-बिट wchar_t हो सकता है आपके पास एन्कोडिंग के रूप में कोई वास्तविक गारंटी नहीं है, इसलिए यदि आप टेक्स्ट प्रोसेसिंग की तरह कुछ करने की कोशिश कर रहे हैं, तो संभवतः आप सबसे ज्यादा टाइपिफ़ चाहते हैं आपके यूनिकोड इकाई के लिए उपयुक्त पूर्णांक प्रकार।

सी ++ 1x UTF-32 डेटा प्रकार UTF-8 एन्कोडिंग स्ट्रिंग शाब्दिक के रूप (u8"text") में अतिरिक्त यूनिकोड समर्थन, और UTF-16 और (char16_t और char32_t IIRC) के साथ-साथ इसी स्ट्रिंग स्थिरांक (u"text" है और U"text")। \uxxxx या \Uxxxxxxxx स्थिरांक के बिना निर्दिष्ट वर्णों पर एन्कोडिंग अभी भी कार्यान्वयन-परिभाषित है, हालांकि (और अक्षर के बाहर जटिल स्ट्रिंग प्रकारों के लिए कोई एन्कोडिंग समर्थन नहीं है)

+0

क्या लोअरकेस शाब्दिक 'यू' केवल वर्णों के लिए नहीं है? – Tomasito665

6

यहां दो मुद्दे हैं। पहला यह है कि सी ++ कोड (और टिप्पणियों), जैसे वेरिएबल नामों में वर्णों की अनुमति है। दूसरा यह है कि तारों और स्ट्रिंग अक्षर में वर्णों की अनुमति है।

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

स्ट्रिंग्स और स्ट्रिंग अक्षर के लिए, सी ++ में एक विस्तृत चरित्र और विस्तृत चरित्र स्ट्रिंग की अवधारणा है। हालांकि, उस चरित्र सेट के लिए एन्कोडिंग अपरिभाषित है। व्यवहार में यह लगभग हमेशा यूनिकोड है, लेकिन मुझे नहीं लगता कि यहां कोई गारंटी है। वाइड कैरेक्टर स्ट्रिंग अक्षर एल "स्ट्रिंग शाब्दिक" की तरह दिखते हैं, और इन्हें std :: wstring के लिए असाइन किया जा सकता है।


सी ++ 11 यूनिकोड तार और स्ट्रिंग शाब्दिक के लिए स्पष्ट समर्थन, UTF-8, UTF-16 बड़ी endian, UTF-16 छोटे endian, UTF-32 बड़ी endian और UTF-32 छोटे endian के रूप में एन्कोड जोड़ा ।

9

litb की पोस्ट के अतिरिक्त, एमएसवीसी ++ यूनिकोड का भी समर्थन करता है। मैं समझता हूं कि यह बीओएम से यूनिकोड एन्कोडिंग प्राप्त करता है।

typedef void ‼; // Also known as \u203C 
class ooɟ { 
    operator ‼() {} 
}; 
+1

यह लेखन के लिए उपयोगी हो सकता है, उदाहरण के लिए, गणितीय सॉफ़्टवेयर जहां स्रोत कोड स्रोत सामग्री के साथ गठबंधन किया जा सकता है। आप जावा में ऐसा कर सकते हैं, जो यूटीएफ -8 स्रोत कोड स्वीकार करता है। हालांकि, सी ++ (और सी) के लिए कोई समस्या नहीं हो सकती है कि कैसे गैर-ASCII टोकन प्रतीक नामों में परिवर्तित हो जाते हैं, जो शेष ऑपरेटिंग सिस्टम के साथ संगत होना चाहिए - न केवल कंपाइलर की एक विशेषता। सी ++ के लिए यह नाम-मैंगलिंग द्वारा subsumed किया जा सकता है। –

2

इस संदर्भ में, यदि आप MSVC++ मिल C4819 चेतावनी, बस स्रोत फ़ाइल "बोम साथ UTF-8" करने के लिए कोडिंग बदलने के लिए: यह निश्चित रूप से आप वास्तव में कोड obfuscuation में कर रहे हैं int (*♫)(); या const std::set<int> ∅; की तरह कोड का समर्थन करता है ।

जीसीसी 4.1 इसका समर्थन नहीं करता है, लेकिन जीसीसी 4.4 करता है, और नवीनतम क्यूटी संस्करण जीसीसी 4.4 का उपयोग करता है, इसलिए स्रोत फ़ाइल कोडिंग के रूप में "यूटीएफ -8 बोम के साथ" का उपयोग करें।

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