2012-08-30 17 views
12

मैं चरित्र/स्ट्रिंग कोड पदों और एन्कोडिंग नियमों के संबंध में सी मानक (C99 और सी 11) अस्पष्ट पाया:सी मानक: चरित्र की स्थापना की और स्ट्रिंग एन्कोडिंग विनिर्देश

सबसे पहले मानक the source character set और the execution character set परिभाषित करता है। अनिवार्य रूप से यह ग्लिफ का एक सेट प्रदान करता है, लेकिन उनके साथ किसी भी संख्यात्मक मानों को संबद्ध नहीं करता है - तो डिफ़ॉल्ट वर्ण सेट क्या है?

मैं यहां एन्कोडिंग के बारे में नहीं पूछ रहा हूं लेकिन केवल ग्लिफ/रेपरोटेयर संख्यात्मक/कोड पॉइंट मैपिंग के लिए। यह universal character names को आईएसओ/आईईसी 10646 के रूप में परिभाषित करता है, लेकिन क्या यह कहता है कि यह डिफ़ॉल्ट वर्णमाला है?

उपरोक्त के विस्तार के रूप में - मुझे कुछ भी नहीं मिला जो कहता है कि संख्यात्मक भागने अनुक्रम \ 0 और \ x प्रतिनिधित्व करते हैं।

सी मानकों से (C99 और C11, मैं एएनएसआई सी जांच नहीं की) मैं निम्नलिखित चरित्र और स्ट्रिंग शाब्दिक के बारे में मिल गया:

+---------+-----+------------+----------------------------------------------+ 
| Literal | Std | Type  | Meaning          | 
+---------+-----+------------+----------------------------------------------+ 
| '...' | C99 | int  | An integer character constant is a sequence | 
|   |  |   | of one or more multibyte characters   | 
| L'...' | C99 | wchar_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| u'...' | C11 | char16_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| U'...' | C11 | char32_t | A wide character constant is a sequence of | 
|   |  |   | one or more multibyte characters    | 
| "..." | C99 | char[]  | A character string literal is a sequence of | 
|   |  |   | zero or more multibyte characters   | 
| L"..." | C99 | wchar_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u8"..." | C11 | char[]  | A UTF-8 string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| u"..." | C11 | char16_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
| U"..." | C11 | char32_t[] | A wide string literal is a sequence of zero | 
|   |  |   | or more multibyte characters     | 
+---------+-----+------------+----------------------------------------------+ 

हालांकि मैं एन्कोडिंग के बारे में कुछ भी नहीं मिला इन शाब्दिकों के लिए नियम। यूटीएफ -8 यूटीएफ -8 एन्कोडिंग संकेत देने लगता है, लेकिन मुझे नहीं लगता कि यह स्पष्ट रूप से का स्पष्ट रूप से उल्लेख किया गया है। इसके अलावा, अन्य प्रकार के लिए एन्कोडिंग अनिर्धारित या कार्यान्वयन निर्भर है?

मैं यूनिक्स विनिर्देश से परिचित नहीं हूं। क्या यूनिक्स विनिर्देश इन नियमों के लिए कोई अतिरिक्त बाधा निर्दिष्ट करता है?

इसके अलावा किसी को भी मुझे बता सकते हैं कि क्या चारसेट/एन्कोडिंग स्कीम जीसीसी और MSVC कि भी मदद मिलेगी द्वारा प्रयोग किया जाता है।

उत्तर

5

सी चरित्र सेट के बारे में लालची नहीं है। "डिफ़ॉल्ट चरित्र सेट" जैसी कोई चीज़ नहीं है, यह कार्यान्वयन परिभाषित है - हालांकि यह ज्यादातर आधुनिक प्रणालियों पर ज्यादातर ASCII या UTF-8 है।

+0

क्या यह यूआई 8 "..." के लिए भी कार्यान्वयन परिभाषित किया गया है? ऐसा लगता है कि उस विशेष शाब्दिक के लिए यूटीएफ -8 एन्कोडिंग की तरफ इशारा करते हुए। – tinkerbeast

+0

@tinkerbeast no - C को किसी विशेष वर्ण सेट की आवश्यकता नहीं है। u8 "..."इंगित करता है कि स्ट्रिंग को आठ-बिट स्टोरेज में फिट वर्णों से बनाया जाना चाहिए। –

+0

@ एच 2CO3 सी 11 कहता है कि यू 8 अक्षर यूटीएफ -8 हैं। मुझे यकीन नहीं है कि कंपाइलर्स को लागू करने के लिए चारों ओर मिल गया है, हालांकि – nos

4

मानक डिफ़ॉल्ट एन्कोडिंग निर्दिष्ट नहीं करता है क्योंकि मौजूदा अभ्यास पहले से ही कई अलग-अलग एन्कोडिंग वाले मशीनों पर लागू किया गया था, उदाहरण के लिए हनीवेल मेनफ्रेम और आईबीएम मेनफ्रेम।

मैं जीसीसी को वर्तमान में एलसी_CHARSET द्वारा निर्दिष्ट लोकेल से अपना डिफ़ॉल्ट लेने की उम्मीद करता हूं, लेकिन मैंने कभी इसका परीक्षण नहीं किया है।

वीसी ++ नियंत्रण कक्ष सेटिंग से अपना डिफ़ॉल्ट लेता है। उस डिफ़ॉल्ट नियंत्रण कक्ष सेटिंग के अनुसार भिन्नता है कि किस देश में विंडोज खरीदा गया था, और अधिकांश उपयोगकर्ता इसे कभी नहीं बदलते हैं, लेकिन विंडोज़ स्थापित करते समय वे इसे बदल सकते हैं बाद में इसे बदल सकते हैं।

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

+0

बीटीडब्लू, क्या आपको कोई विचार है कि क्यों ट्रिग्राफ को बदसूरत होने के लिए चुना गया था, फिर भी वे स्ट्रिंग के भीतर क्यों काम करते हैं और चरित्र अक्षर? मेरा सिद्धांत, कोड को देखते हुए, यह है कि वे एक निष्क्रिय-आक्रामक व्यक्ति द्वारा चुने गए थे जो उन्हें पहले स्थान पर नहीं चाहते थे। मुझे लगता है कि यह सुनिश्चित करने के लिए पूरी तरह से पर्याप्त होना चाहिए कि यदि कोई लाइन शुरू होती है '# परिभाषित __BACKSLASH_DESIGNATOR' के साथ, वर्ण या अनुक्रम के किसी भी उपस्थिति (जिसमें मानक सी सेट के बाहर कम से कम एक वर्ण होना चाहिए) को बैकस्लैश के रूप में माना जाएगा; अन्य वर्ण तब बैकस्लैश डिग्राफ का उपयोग कर सकते हैं । – supercat

+1

@supercat: [यह पृष्ठ] (http://www.lysator.liu.se/c/rat/b.html#2-2-1-1) ट्रिग्राफ के उद्देश्य को बताता है। यह तब से आता है जब एएनएसआई सी मानक अभी भी एक मसौदा था, और उस मानक में किए गए कई निर्णयों के लिए तर्क युक्त दस्तावेज का हिस्सा है। –

+0

@ पीटरो .: इसके लिए धन्यवाद। मुझे अभी भी उत्सुकता है कि क्या किसी भी चरित्र सेट का उपयोग किया गया था, जिसमें बैकस्लैश नहीं था * और * में गैर-ASCII वर्ण नहीं था जिसे एक ही प्रभाव के लिए घोषित किया जा सकता था? जब मैं पीएल/आई प्रोग्रामिंग कर रहा था, तो टर्मिनल सभी एएससीआईआई थे और पीएल/आई के लिए आवश्यक चरित्र नहीं था, लेकिन चूंकि पीएल/मैंने '^' का उपयोग नहीं किया था, ASCII-to-EBCDIC अनुवाद बस ASCII '^' को EBCDIC '¬' में परिवर्तित कर दिया। मुझे आश्चर्य है कि क्या एक ही दृष्टिकोण सी के साथ काम कर सकता था - घोषणा करें कि प्रत्येक कार्यान्वयन को "बचने" चरित्र (जो ASCII के लिए '\' होगा 'नामित करना होगा, और ... – supercat

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