2013-02-04 17 views
5

एक स्ट्रिंग अक्षर जो एक एन्कोडिंग-उपसर्ग के साथ शुरू नहीं होता है वह सामान्य स्ट्रिंग शाब्दिक है, और दिए गए वर्णों के साथ प्रारंभ किया जाता है।सी ++ 11: साधारण स्ट्रिंग शाब्दिक और यूटीएफ -8 स्ट्रिंग के बीच अंतर का उदाहरण शाब्दिक?

u8 "asdf" जैसे यू 8 के साथ शुरू होता है एक स्ट्रिंग अक्षर, एक यूटीएफ -8 स्ट्रिंग अक्षर है और यूटीएफ -8 में एन्कोड किए गए वर्णों के साथ प्रारंभ किया जाता है।

मुझे सामान्य स्ट्रिंग शाब्दिक और यूटीएफ -8 स्ट्रिंग शाब्दिक के बीच का अंतर समझ में नहीं आता है।

क्या कोई ऐसी परिस्थिति का उदाहरण प्रदान कर सकता है जहां वे अलग हैं? (कारण अलग संकलक उत्पादन)

(मैं मानक की पीओवी से, नहीं किसी विशेष कार्यान्वयन मतलब)

एक चरित्र में प्रत्येक स्रोत वर्ण सेट सदस्य शाब्दिक या एक स्ट्रिंग शाब्दिक, साथ ही प्रत्येक भागने एक वर्ण शाब्दिक या गैर-कच्चे स्ट्रिंग अक्षर में अनुक्रम और सार्वभौमिक-चरित्र-नाम, निष्पादन वर्ण सेट के संबंधित सदस्य में परिवर्तित हो गया है।

+5

कंपाइलर जो भी एन्कोडिंग सबसे अच्छा है, में एक सामान्य स्ट्रिंग अक्षर है; एक यूटीएफ -8 स्ट्रिंग अक्षर यूटीएफ -8 (मानक द्वारा अनिवार्य) में एन्कोड किया गया है। –

+0

@MatteoItalia: आपका क्या मतलब है "कंपाइलर सबसे अच्छा पसंद करता है"? जब आप कहते हैं कि यह "एक्स में एन्कोड किया गया है", तो क्या आप स्रोत फ़ाइल में या निष्पादन योग्य में हैं? कार्यक्रम में –

+3

। मानक निष्पादन योग्य के बारे में नहीं जानता है। –

उत्तर

6

सी और सी ++ भाषाएं उनके कार्यान्वयन में अक्षांश की एक बड़ी मात्रा की अनुमति देती हैं। यू को यूटीएफ -8 "एकल बाइट्स में टेक्स्ट एन्कोड करने का तरीका" से पहले लिखा गया था: विभिन्न प्रणालियों में अलग-अलग टेक्स्ट एन्कोडिंग थीं।

तो सी और सी ++ में स्ट्रिंग के लिए बाइट मान वास्तव में कंपाइलर तक क्या हैं। 'A' जो भी संकलक का चुना हुआ एन्कोडिंग चरित्र A के लिए है, जो यूटीएफ -8 से सहमत नहीं हो सकता है।

सी ++ ने आवश्यकता को जोड़ा है कि असली यूटीएफ -8 स्ट्रिंग अक्षर को कंपेलरों द्वारा समर्थित किया जाना चाहिए। u8"A"[0] का बिट मान यूटीएफ -8 मानक के माध्यम से सी ++ मानक द्वारा तय किया गया है, भले ही संकलक लक्ष्यीकरण प्लेटफॉर्म के पसंदीदा एन्कोडिंग के बावजूद।

अब, अधिकांश प्लेटफ़ॉर्म सी ++ लक्ष्य 2 के पूरक पूर्णांक का उपयोग करते हैं, अधिकांश कंपेलरों में वर्ण एन्कोडिंग होते हैं जो अधिकतर यूटीएफ -8 के साथ संगत होते हैं। तो "hello world" जैसे तारों के लिए, u8"hello world" लगभग निश्चित रूप से समान होगा।

एक ठोस उदाहरण के लिए, से man gcc

-fexec-charset = चारसेट

निष्पादन वर्ण सेट, स्ट्रिंग और चरित्र स्थिरांक के लिए इस्तेमाल किया सेट करें। डिफ़ॉल्ट यूटीएफ -8 है। वर्णसेट सिस्टम के iconv लाइब्रेरी दिनचर्या द्वारा समर्थित कोई एन्कोडिंग हो सकता है।

-finput-charset = चारसेट

इनपुट वर्ण सेट, स्रोत चरित्र जीसीसी द्वारा इस्तेमाल किया सेट करने के लिए इनपुट फ़ाइल के वर्ण सेट से अनुवाद के लिए इस्तेमाल किया सेट करें। यदि लोकेल निर्दिष्ट नहीं करता है, या जीसीसी लोकल से यह जानकारी नहीं प्राप्त कर सकता है, तो डिफ़ॉल्ट यूटीएफ -8 है। इसे लोकेल या इस कमांड लाइन विकल्प द्वारा ओवरराइड किया जा सकता है। यदि कोई संघर्ष है तो वर्तमान में कमांड लाइन विकल्प प्राथमिकता लेता है। वर्णसेट सिस्टम के iconv लाइब्रेरी दिनचर्या द्वारा समर्थित कोई एन्कोडिंग हो सकता है।

सी/सी ++ के निष्पादन और इनपुट चरित्र सेट को बदलने में सक्षम होने का एक उदाहरण है।

+0

तो स्पष्टीकरण के लिए, u8 उपसर्ग अनुवाद चरण 5 के दौरान चार सरणी के रूप में स्ट्रिंग अक्षर को उत्पन्न करते समय निष्पादन वर्ण सेट को प्रभावित करता है। U8 उपसर्ग का अनुवाद चरण चरण 1 के दौरान स्ट्रिंग अक्षर को पढ़ने के लिए उपयोग किए गए इनपुट वर्ण सेट पर कोई प्रभाव नहीं पड़ता है। –

+0

@ user1131467 मुझे विश्वास है, एक बियर-शर्त स्तर पर। चूंकि इनपुट वर्णसेट सिद्धांत में हो सकता है कि आपका इनपुट-वर्णसेट जागरूक संपादक ''' '' 'के रूप में प्रदर्शित होता है, और' + 'के लिए utf-8 कोड है, और संकलक इसे' '' 'के रूप में पढ़ता है। हां, स्रोत फ़ाइल में बाइट्स केवल कंपाइलर के लिए इनपुट वर्णसेट के संदर्भ में किसी भी तरह का अर्थ बनाते हैं। यह एक प्रत्याशित कानूनी सी/सी ++ प्रोग्राम लिखने के लिए obfuscated प्रोग्रामिंग का एक दिलचस्प हिस्सा होगा जो वास्तव में कुछ जटिल रूप से अलग करता है क्योंकि इनपुट कैरसेट इसे संकलित करने के लिए उपयोग किया जाता है। – Yakk

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