सी में एस्केप सीक्वेंस: Difference between revisions

From Vigyanwiki
No edit summary
No edit summary
 
(11 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Short description|Escape characters and related in the C programming language}}
{{Short description|Escape characters and related in the C programming language}}
एस्केप सीक्वेंस का उपयोग प्रोग्रामिंग लैंग्वेज [[सी (प्रोग्रामिंग भाषा)]] और [[सी ++]] में किया जाता है, और उनके डिजाइन को कई अन्य भाषाओं जैसे [[जावा (प्रोग्रामिंग भाषा)]], [[पीएचपी]], सी शार्प (प्रोग्रामिंग लैंग्वेज), आदि में कॉपी किया गया था। एस्केप सीक्वेंस वर्णों का एक क्रम है जो किसी वर्ण या स्ट्रिंग शाब्दिक के अंदर उपयोग किए जाने पर स्वयं का प्रतिनिधित्व नहीं करता है, लेकिन किसी अन्य वर्ण या वर्णों के अनुक्रम में अनुवाद किया जाता है जो सीधे प्रतिनिधित्व करना मुश्किल या असंभव हो सकता है।
एस्केप सीक्वेंस का उपयोग प्रोग्रामिंग लैंग्वेज [[सी (प्रोग्रामिंग भाषा)]] और [[सी ++]] में किया जाता है, और उनके डिजाइन को कई अन्य भाषाओं जैसे [[जावा (प्रोग्रामिंग भाषा)]], [[पीएचपी]], सी शार्प (प्रोग्रामिंग लैंग्वेज), आदि में कॉपी किया गया था। एस्केप सीक्वेंस वर्णों का एक क्रम है जो किसी वर्ण या स्ट्रिंग शाब्दिक के अंदर उपयोग किए जाने पर स्वयं का प्रतिनिधित्व नहीं करता है, किन्तु किसी अन्य वर्ण या वर्णों के अनुक्रम में अनुवाद किया जाता है जो सीधे प्रतिनिधित्व करना कठिन या असंभव हो सकता है।


C में, सभी एस्केप सीक्वेंस में दो या दो से अधिक वर्ण होते हैं, जिनमें से पहला बैकस्लैश {{mono|\}} (जिसे [[पलायनवादी चरित्र|एस्केप कैरेक्टर]] कहा जाता है) है, शेष वर्ण एस्केप कैरेक्टर की व्याख्या निर्धारित करते हैं। उदाहरण के लिए, {{mono|\n}} एस्केप सीक्वेंस है जो [[नई पंक्ति]] स्वरूप को दर्शाता है।
C में, सभी एस्केप सीक्वेंस में दो या दो से अधिक वर्ण होते हैं, जिनमें से पहला बैकस्लैश {{mono|\}} (जिसे [[पलायनवादी चरित्र|एस्केप कैरेक्टर]] कहा जाता है) है, शेष वर्ण एस्केप कैरेक्टर की व्याख्या निर्धारित करते हैं। उदाहरण के लिए, {{mono|\n}} एस्केप सीक्वेंस है जो [[नई पंक्ति]] स्वरूप को दर्शाता है।


== प्रेरणा ==
== प्रेरणा ==
मान लीजिए कि हम {{mono|हैलो,}} को एक लाइन पर, और उसके बाद {{mono|वर्ल्ड!}} अगली पंक्ति पर प्रिंट करना चाहते हैं। निम्नानुसार एक शाब्दिक के रूप में मुद्रित होने वाली स्ट्रिंग का प्रतिनिधित्व करने का प्रयास किया जा सकता है:<syntaxhighlight lang="d">
मान लीजिए कि हम {{mono|हैलो,}} को एक लाइन पर, और उसके बाद {{mono|वर्ल्ड!}}अगली पंक्ति पर प्रिंट करना चाहते हैं। निम्नानुसार एक शाब्दिक के रूप में मुद्रित होने वाली स्ट्रिंग का प्रतिनिधित्व करने का प्रयास किया जा सकता है:<syntaxhighlight lang="d">
#include <stdio.h>
#include <stdio.h>
int main() {
int main() {
Line 16: Line 16:
     printf("Hello,%cworld!", 0x0A);
     printf("Hello,%cworld!", 0x0A);
}
}
</syntaxhighlight>यह प्रोग्राम {{mono|Hello,}} को प्रिंट करने का निर्देश देता है, उसके बाद [[बाइट]] जिसका संख्यात्मक मान {{mono|0x0A}}, है, जिसके बाद {{mono|world!}} है। जबकि यह वास्तव में तब काम करेगा जब मशीन ASCII एन्कोडिंग का उपयोग करती है, यह उन सिस्टम पर काम नहीं करेगी जो अन्य एन्कोडिंग का उपयोग करते हैं, जिनके पास न्यूलाइन कैरेक्टर के लिए अलग संख्यात्मक मान है। यह अच्छा समाधान भी नहीं है क्योंकि यह अभी भी शाब्दिक के अंदर न्यूलाइन वर्ण का प्रतिनिधित्व करने की अनुमति नहीं देता है, और इसके बजाय [[printf|प्रिंटफ]] के शब्दार्थ का लाभ उठाता है। इन समस्याओं को हल करने और सिस्टम के बीच अधिकतम पोर्टेबिलिटी सुनिश्चित करने के लिए, सी एक शाब्दिक के अंदर {{mono|\n}} को न्यूलाइन वर्ण के रूप में व्याख्या करता है, जो कुछ भी लक्ष्य प्रणाली पर हो सकता है:
</syntaxhighlight>यह प्रोग्राम {{mono|Hello,}} को प्रिंट करने का निर्देश देता है, उसके बाद [[बाइट]] जिसका संख्यात्मक मान {{mono|0x0A}}, है, जिसके बाद {{mono|world!}} है। जबकि यह वास्तविक में तब काम करेगा जब मशीन ASCII एन्कोडिंग का उपयोग करती है, यह उन सिस्टम पर काम नहीं करेगी जो अन्य एन्कोडिंग का उपयोग करते हैं, जिनके पास न्यूलाइन कैरेक्टर के लिए अलग संख्यात्मक मान है। यह अच्छा समाधान भी नहीं है क्योंकि यह अभी भी शाब्दिक के अंदर न्यूलाइन वर्ण का प्रतिनिधित्व करने की अनुमति नहीं देता है, और इसके बजाय [[printf|प्रिंटफ]] के शब्दार्थ का लाभ उठाता है। इन समस्याओं को हल करने और सिस्टम के बीच अधिकतम पोर्टेबिलिटी सुनिश्चित करने के लिए, सी एक शाब्दिक के अंदर {{mono|\n}} को न्यूलाइन वर्ण के रूप में व्याख्या करता है, जो कुछ भी लक्ष्य प्रणाली पर हो सकता है:<syntaxhighlight lang="d">
 
#include <stdio.h>
<वाक्यविन्यास प्रकाश लैंग = सी>
int main() {
#शामिल <stdio.h>
     printf("Hello,\nworld!");
मुख्य प्रवेश बिंदु() {
     प्रिंटफ (हैलो, \ n दुनिया!);
}
}
</वाक्यविन्यास हाइलाइट>
</syntaxhighlight>इस कोड में, एस्केप सीक्वेंस {{mono|\n}} अक्षर {{mono|n}} के बाद बैकस्लैश के लिए खड़ा नहीं होता है, क्योंकि बैकस्लैश सामान्य तरीके से "एस्केप" का कारण बनता है, जिसकी व्याख्या कंपाइलर द्वारा की जाती है। बैकस्लैश को देखने के बाद, कंपाइलर किसी अन्य चरित्र से एस्केप सीक्वेंस को पूरा करने की अपेक्षा करता है, और फिर एस्केप सीक्वेंस को बाइट्स में ट्रांसलेट करता है, जिसका प्रतिनिधित्व करने का इरादा है। इस प्रकार, "{{mono|"Hello,\nworld!"}} एक एम्बेडेड न्यूलाइन के साथ एक स्ट्रिंग का प्रतिनिधित्व करता है, भले ही इसका उपयोग {{mono|printf}} के अंदर या कहीं और किया गया हो।


इस कोड में, भागने का क्रम {{mono|\n}} पत्र के बाद बैकस्लैश के लिए खड़ा नहीं होता है {{mono|n}}, क्योंकि बैकस्लैश सामान्य तरीके से पलायन का कारण बनता है, जिसकी व्याख्या संकलक द्वारा की जाती है। बैकस्लैश को देखने के बाद, कंपाइलर किसी अन्य चरित्र से एस्केप सीक्वेंस को पूरा करने की अपेक्षा करता है, और फिर एस्केप सीक्वेंस को बाइट्स में ट्रांसलेट करता है, जिसका प्रतिनिधित्व करने का इरादा है। इस प्रकार, {{mono|"Hello,\nworld!"}} एम्बेडेड न्यूलाइन के साथ स्ट्रिंग का प्रतिनिधित्व करता है, भले ही इसका उपयोग अंदर किया गया हो {{mono|printf}} या कहीं और।
यह इस मुद्दे को उठाता है कि शाब्दिक के अंदर वास्तविकिक बैकस्लैश का प्रतिनिधित्व कैसे किया जाए। यह एस्केप सीक्वेंस {{mono|\\}} का उपयोग करके किया जाता है , जैसा कि अगले भाग में देखा गया है।


यह इस मुद्दे को उठाता है कि शाब्दिक के अंदर वास्तविक बैकस्लैश का प्रतिनिधित्व कैसे किया जाए। यह एस्केप सीक्वेंस का उपयोग करके किया जाता है {{mono|\\}}, जैसा कि अगले भाग में देखा गया है।
कुछ भाषाओं में एस्केप सीक्वेंस नहीं होते हैं, उदाहरण के लिए [[पास्कल (प्रोग्रामिंग भाषा)]]। इसके बजाय नई पंक्ति सहित कमांड का उपयोग किया जाएगा ({{mono|writeln}} नई पंक्ति शामिल है, {{mono|write}} इसे बाहर करता है)।<syntaxhighlight lang="d">
writeln('Hello');
write('world!');


कुछ भाषाओं में एस्केप सीक्वेंस नहीं होते हैं, उदाहरण के लिए [[पास्कल (प्रोग्रामिंग भाषा)]]। इसके बजाय नई पंक्ति सहित कमांड का उपयोग किया जाएगा ({{mono|writeln}} नई पंक्ति शामिल है, {{mono|write}} इसे बाहर करता है)।
</syntaxhighlight>
<वाक्यविन्यास लैंग = पास्कल>
राइटलन ('हैलो');
लिखें ('दुनिया!');
</वाक्यविन्यास हाइलाइट>


== भागने के क्रम की तालिका ==
== एस्केप के क्रम की तालिका ==
निम्नलिखित एस्केप सीक्वेंस को मानक सी में परिभाषित किया गया है। यह तालिका उन मानों को भी दिखाती है जिन्हें वे ASCII में मैप करते हैं। हालाँकि, इन एस्केप सीक्वेंस का उपयोग C कंपाइलर के साथ किसी भी सिस्टम पर किया जा सकता है, और यदि सिस्टम ASCII पर आधारित वर्ण एन्कोडिंग का उपयोग नहीं करता है, तो यह विभिन्न मानों पर मैप कर सकता है।
निम्नलिखित एस्केप सीक्वेंस को मानक सी में परिभाषित किया गया है। यह तालिका उन मानों को भी दिखाती है जिन्हें वे ASCII में मैप करते हैं। हालाँकि, इन एस्केप सीक्वेंस का उपयोग C कंपाइलर के साथ किसी भी सिस्टम पर किया जा सकता है, और यदि सिस्टम ASCII पर आधारित वर्ण एन्कोडिंग का उपयोग नहीं करता है, तो यह विभिन्न मानों पर मैप कर सकता है।
{| class="wikitable sortable"
{| class="wikitable sortable"
|-
|-
! Escape sequence !! Hex value in ASCII !! Character represented
! एस्केप का क्रम !! ASCII में हेक्स मान !! वर्ण का प्रतिनिधित्व किया
|-
|-
| {{mono|\a}} || 07 || [[Bell character|Alert (Beep, Bell)]] (added in C89)<ref name="Rationale_2003_C"/>
| {{mono|\a}} || 07 || [[Bell character|अलर्ट (बीप, बेल)]] (C89 में जोड़ा गया)<ref name="Rationale_2003_C"/>  
|-
|-
| {{mono|\b}} || 08 || [[Backspace]]
| {{mono|\b}} || 08 || [[Backspace|बैकस्पेस]]
|-
|-
| {{mono|\e}}{{Ref|Note1|note 1}} || 1B || [[Escape character]]
| {{mono|\e}}{{Ref|Note1|note 1}} || 1B || [[Escape character|एस्केप कैरेक्टर]]
|-
|-
| {{mono|\f}} || 0C || [[Formfeed]] [[Page Break]]
| {{mono|\f}} || 0C || [[Formfeed|फॉर्मफीड]] [[Page Break|पेज ब्रेक]]
|-
|-
| {{mono|\n}} || 0A || [[Newline]] (Line Feed); see notes below
| {{mono|\n}} || 0A || [[Newline|न्यूलाइन]] (लाइन फीड); नीचे नोट्स देखें
|-
|-
| {{mono|\r}} || 0D || [[Carriage Return]]
| {{mono|\r}} || 0D || [[Carriage Return]]
|-
|-
| {{mono|\t}} || 09 || [[Horizontal Tab]]
| {{mono|\t}} || 09 || [[Horizontal Tab|क्षैतिज टैब]]
|-
|-
| {{mono|\v}} || 0B || [[Vertical Tab]]
| {{mono|\v}} || 0B || [[Vertical Tab|लंबवत टैब]]
|-
|-
| {{mono|\\}} || 5C || [[Backslash]]
| {{mono|\\}} || 5C || [[Backslash|बैकस्लैश]]
|-
|-
| {{mono|\'}} || 27 || [[Apostrophe]] or single quotation mark
| {{mono|\'}} || 27 || [[Apostrophe|एपोस्ट्रोफी]] या एकल उद्धरण चिह्न
|-
|-
| {{mono|\"}} || 22 || Double [[quotation mark]]
| {{mono|\"}} || 22 || दोहरा [[quotation mark|उद्धरण चिह्न]]  
|-
|-
| {{mono|\?}} || 3F || [[Question mark]] (used to avoid [[Digraphs and trigraphs#C|trigraphs]])
| {{mono|\?}} || 3F || [[Question mark|प्रश्न चिह्न]] ( [[Digraphs and trigraphs#C|ट्रिग्राफ]] से बचने के लिए प्रयुक्त)  
|-
|-
| {{mono|\''nnn''}}{{Ref|Note2|note 2}} || any || The byte whose numerical value is given by ''nnn'' interpreted as an [[octal]] number
| {{mono|\''nnn''}}{{Ref|Note2|note 2}} || कोई || वह बाइट जिसका संख्यात्मक मान nnn द्वारा दिया जाता है, एक [[octal|ऑक्टल]] संख्या के रूप में व्याख्या की जाती है
|-
|-
| {{mono|\x''hh…''}} || any || The byte whose numerical value is given by ''hh…'' interpreted as a [[hexadecimal]] number
| {{mono|\x''hh…''}} || कोई || वह बाइट जिसका संख्यात्मक मान hh… द्वारा दिया जाता है, एक [[hexadecimal|हेक्साडेसिमल]] संख्या के रूप में व्याख्या की जाती है
|-
|-
| {{mono|\u''hhhh''}}{{Ref|Note3|note 3}} || none || [[Unicode]] [[code point]] below 10000 hexadecimal (added in C99){{R|Rationale_2003_C|p=26}}
| {{mono|\u''hhhh''}}{{Ref|Note3|note 3}} || कोई नहीं || 10000 हेक्साडेसिमल से नीचे [[Unicode|यूनिकोड]] [[code point|कोड]] [[code point|बिंदु]] (C99 में जोड़ा गया) {{R|Rationale_2003_C|p=26}}
|-
|-
| {{mono|\U''hhhhhhhh''}}{{Ref|Note4|note 4}} || none || Unicode code point where ''h'' is a hexadecimal digit
| {{mono|\U''hhhhhhhh''}}{{Ref|Note4|note 4}} || कोई नहीं || यूनिकोड कोड बिंदु जहाँ h एक हेक्साडेसिमल अंक है
|}
|}
:नोट 1।{{Note|Note1}}सामान्य अमानक कोड; नीचे नोट्स अनुभाग देखें।
:नोट 1।{{Note|Note1}}सामान्य अमानक कोड; नीचे नोट्स अनुभाग देखें।
Line 79: Line 75:


===टिप्पणियाँ===
===टिप्पणियाँ===
{{mono|\n}} produces one byte, despite the fact that the [[Newline#Issues_with_different_newline_formats|platform may use]] more than one byte to denote a newline, such as the [[DOS]]/[[Windows]] [[CRLF]] sequence, {{mono|0x0D 0x0A}}. The translation from {{mono|0x0A}} to {{mono|0x0D 0x0A}} on DOS and Windows occurs when the byte is written out to a file or to the console, and the inverse translation is done when text files are read.
{{mono|\n}} एक बाइट उत्पन्न करता है, इस तथ्य के बावजूद कि [[Newline#Issues_with_different_newline_formats|प्लेटफॉर्म]] एक नई पंक्ति को इंगित करने के लिए एक से अधिक बाइट का उपयोग कर सकता है, जैसे कि [[DOS|डॉस]]/[[Windows|विंडोज]] [[CRLF|सीआरएलएफ]] अनुक्रम, {{mono|0x0D 0x0A}}। डॉस और विंडोज पर 0x0A से 0x0D 0x0A में अनुवाद तब होता है जब बाइट को फ़ाइल या कंसोल पर लिखा जाता है, और पाठ फ़ाइलों को पढ़ने पर उलटा अनुवाद किया जाता है।


A hex escape sequence must have at least one hex digit following {{mono|\x}}, with no upper bound; it continues for as many hex digits as there are. Thus, for example, {{mono|\xABCDEFG}} denotes the byte with the numerical value ABCDEF<sub>16</sub>, followed by the letter {{mono|G}}, which is not a hex digit. However, if the resulting integer value is too large to fit in a single byte, the actual numerical value assigned is implementation-defined. Most platforms have 8-bit {{mono|char}} types, which limits a useful hex escape sequence to two hex digits. However, hex escape sequences longer than two hex digits might be useful inside a wide character or wide string literal(prefixed with L):
एक हेक्स एस्केप सीक्वेंस में \x के बाद कम से कम एक हेक्स अंक होना चाहिए, जिसमें कोई ऊपरी सीमा नहीं है; यह उतने ही हेक्स अंकों के लिए जारी है जितने कि हैं। इस प्रकार, उदाहरण के लिए, {{mono|\xABCDEFG}} संख्यात्मक मान ABCDEF<sub>16</sub> के साथ बाइट को दर्शाता है, उसके बाद अक्षर G आता है, जो एक हेक्स अंक नहीं है। हालाँकि, यदि परिणामी पूर्णांक मान एक बाइट में फ़िट होने के लिए बहुत बड़ा है, तो असाइन किया गया वास्तविकिक संख्यात्मक मान कार्यान्वयन-परिभाषित है। अधिकांश प्लेटफार्मों में 8-बिट चार प्रकार होते हैं, जो एक उपयोगी हेक्स एस्केप अनुक्रम को दो हेक्स अंकों तक सीमित करता है। हालाँकि, दो हेक्स अंकों से अधिक लंबे हेक्स एस्केप सीक्वेंस एक विस्तृत वर्ण या विस्तृत स्ट्रिंग शाब्दिक (एल के साथ उपसर्ग) के अंदर उपयोगी हो सकते हैं:<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
char s1[] = "\x12";      // single char with value 0x12 (18 in decimal)
char s1[] = "\x12";      // single char with value 0x12 (18 in decimal)
char s1[] = "\x1234";    // single char with implementation-defined value, unless char is long enough
char s1[] = "\x1234";    // single char with implementation-defined value, unless char is long enough
Line 88: Line 83:
</syntaxhighlight>
</syntaxhighlight>


An octal escape sequence consists of {{mono|\}} followed by one, two, or three octal digits. The octal escape sequence ends when it either contains three octal digits already, or the next character is not an octal digit. For example, {{mono|\11}} is a single octal escape sequence denoting a byte with numerical value 9 (11 in octal), rather than the escape sequence {{mono|\1}} followed by the digit {{mono|1}}. However, {{mono|\1111}} is the octal escape sequence {{mono|\111}} followed by the digit {{mono|1}}. In order to denote the byte with numerical value 1, followed by the digit {{mono|1}}, one could use {{mono|"\1""1"}}, since C automatically concatenates adjacent string literals. Note that some three-digit octal escape sequences may be too large to fit in a single byte; this results in an implementation-defined value for the byte actually produced. The escape sequence {{mono|\0}} is a commonly used octal escape sequence, which denotes the null character, with value zero.
एक ऑक्टल एस्केप सीक्वेंस में {{mono|\}}के बाद एक, दो या तीन ऑक्टल अंक होते हैं। ऑक्टल एस्केप सीक्वेंस तब समाप्त होता है जब इसमें पहले से ही तीन ऑक्टल अंक होते हैं, या अगला वर्ण ऑक्टल अंक नहीं होता है। उदाहरण के लिए, {{mono|\11}} एक सिंगल ऑक्टल एस्केप सीक्वेंस है, जो संख्यात्मक मान 9 (ऑक्टल में 11) के साथ एक बाइट को दर्शाता है, न कि एस्केप सीक्वेंस {{mono|\1}} के बाद अंक {{mono|1}} बाद। हालांकि, {{mono|\1111}} ऑक्टल एस्केप सीक्वेंस {{mono|\111}} के बाद अंक {{mono|1}} आता है। । संख्यात्मक मान 1 के साथ बाइट को दर्शाने के लिए, अंक 1 के बाद, कोई {{mono|"\1""1"}} का उपयोग कर सकता है, क्योंकि C स्वचालित रूप से आसन्न स्ट्रिंग अक्षर को जोड़ता है। ध्यान दें कि कुछ तीन-अंकीय ऑक्टल एस्केप अनुक्रम एक बाइट में फ़िट होने के लिए बहुत बड़े हो सकते हैं; इसका परिणाम वास्तविक में उत्पादित बाइट के लिए कार्यान्वयन-परिभाषित मूल्य में होता है। एस्केप सीक्वेंस {{mono|\0}} एक आमतौर पर इस्तेमाल किया जाने वाला ऑक्टल एस्केप सीक्वेंस है, जो शून्य वर्ण के साथ, शून्य वर्ण को दर्शाता है।
 


=== गैर-मानक पलायन अनुक्रम ===
=== गैर-मानक पलायन अनुक्रम ===
क्रम जैसे {{Mono|\z}} सी मानक के अनुसार वैध एस्केप सीक्वेंस नहीं है क्योंकि यह उपरोक्त तालिका में नहीं पाया जाता है। सी मानक को निदान के लिए ऐसे अमान्य एस्केप सीक्वेंस की आवश्यकता होती है (यानी, कंपाइलर को त्रुटि संदेश प्रिंट करना होगा)। इस तथ्य के बावजूद, कुछ संकलक कार्यान्वयन-परिभाषित शब्दार्थ के साथ अतिरिक्त एस्केप सीक्वेंस को परिभाषित कर सकते हैं। उदाहरण है {{Mono|\e}} एस्केप सीक्वेंस, जिसका ASCII में हेक्साडेसिमल मान के रूप में 1B है, एस्केप कैरेक्टर का प्रतिनिधित्व करता है, और [[जीएनयू संकलक संग्रह]] में समर्थित है,<ref name="GCC"/>[[बजना]] और [[टिनी सी कंपाइलर]]हालाँकि इसे C मानक प्रदर्शनों की सूची में नहीं जोड़ा गया था, क्योंकि कुछ वर्ण सेटों (जैसे [[EBCDIC]]) में इसका कोई सार्थक समकक्ष नहीं है।<ref name="Rationale_2003_C"/>
क्रम जैसे {{Mono|\z}} सी मानक के अनुसार वैध एस्केप सीक्वेंस नहीं है क्योंकि यह उपरोक्त तालिका में नहीं पाया जाता है। सी मानक को निदान के लिए ऐसे अमान्य एस्केप सीक्वेंस की आवश्यकता होती है (यानी, कंपाइलर को त्रुटि संदेश प्रिंट करना होगा)। इस तथ्य के बावजूद, कुछ संकलक कार्यान्वयन-परिभाषित शब्दार्थ के साथ अतिरिक्त एस्केप सीक्वेंस को परिभाषित कर सकते हैं। उदाहरण है {{Mono|\e}} एस्केप सीक्वेंस, जिसका ASCII में हेक्साडेसिमल मान के रूप में 1B है, जो एस्केप कैरेक्टर का प्रतिनिधित्व करता है, और [[जीएनयू संकलक संग्रह]],<ref name="GCC"/> [[बजना]] और [[टिनी सी कंपाइलर]] में समर्थित है। हालाँकि इसे C मानक प्रदर्शनों की सूची में नहीं जोड़ा गया था, क्योंकि कुछ वर्ण सेटों (जैसे [[EBCDIC]]) में इसका कोई सार्थक समकक्ष नहीं है।<ref name="Rationale_2003_C"/>




Line 98: Line 92:
[[C99]] मानक से, C ने एस्केप सीक्वेंस का भी समर्थन किया है जो स्ट्रिंग शाब्दिक में [[यूनिकोड]] कोड बिंदुओं को दर्शाता है। इस तरह के एस्केप सीक्वेंस को यूनिवर्सल कैरेक्टर नेम कहा जाता है और इनका फॉर्म होता है {{mono|\u''hhhh''}} या {{mono|\U''hhhhhhhh''}}, कहाँ {{mono|''h''}} हेक्स अंक के लिए खड़ा है। माना जाने वाले अन्य पलायन अनुक्रमों के विपरीत, सार्वभौमिक वर्ण नाम से अधिक कोड इकाई में विस्तारित हो सकता है।
[[C99]] मानक से, C ने एस्केप सीक्वेंस का भी समर्थन किया है जो स्ट्रिंग शाब्दिक में [[यूनिकोड]] कोड बिंदुओं को दर्शाता है। इस तरह के एस्केप सीक्वेंस को यूनिवर्सल कैरेक्टर नेम कहा जाता है और इनका फॉर्म होता है {{mono|\u''hhhh''}} या {{mono|\U''hhhhhhhh''}}, कहाँ {{mono|''h''}} हेक्स अंक के लिए खड़ा है। माना जाने वाले अन्य पलायन अनुक्रमों के विपरीत, सार्वभौमिक वर्ण नाम से अधिक कोड इकाई में विस्तारित हो सकता है।


क्रम {{mono|\u''hhhh''}} [[कोड बिंदु]] को दर्शाता है {{mono|''hhhh''}}, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। क्रम {{mono|\U''hhhhhhhh''}} कोड बिंदु को दर्शाता है {{mono|''hhhhhhhh''}}, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। (इसलिए, U+10000 या उच्चतर पर स्थित कोड बिंदुओं को इसके साथ चिह्नित किया जाना चाहिए {{mono|\U}} सिंटैक्स, जबकि निम्न कोड बिंदु उपयोग कर सकते हैं {{mono|\u}} या {{mono|\U}}।) लक्ष्य प्रणाली पर गंतव्य प्रकार के एन्कोडिंग में कोड बिंदु को कोड इकाइयों के अनुक्रम में परिवर्तित किया जाता है। उदाहरण के लिए (जहां एन्कोडिंग [[UTF-8]] है, और [[UTF-16]] के लिए {{mono|wchar_t}}):
क्रम {{mono|\u''hhhh''}} [[कोड बिंदु]] को दर्शाता है {{mono|''hhhh''}}, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। क्रम {{mono|\U''hhhhhhhh''}} कोड बिंदु को दर्शाता है {{mono|''hhhhhhhh''}}, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। (इसलिए, U+10000 या उच्चतर पर स्थित कोड बिंदुओं को इसके साथ चिह्नित किया जाना चाहिए {{mono|\U}} सिंटैक्स, जबकि निम्न कोड बिंदु उपयोग कर सकते हैं {{mono|\u}} या {{mono|\U}}।) लक्ष्य प्रणाली पर गंतव्य प्रकार के एन्कोडिंग में कोड बिंदु को कोड इकाइयों के अनुक्रम में परिवर्तित किया जाता है। उदाहरण के लिए (जहां एन्कोडिंग [[UTF-8]] है, और [[UTF-16]] के लिए {{mono|wchar_t}}):<syntaxhighlight lang="d">
<वाक्यविन्यास प्रकाश लैंग = सी>
char s1[] = "\xC0"; // A single byte with the value 0xC0, not valid UTF-8
चार एस 1 [] = \ xC0; // 0xC0 मान वाला बाइट, वैध UTF-8 नहीं
char s2[] = "\u00C0"; // Two bytes with values 0xC3, 0x80, the UTF-8 encoding of U+00C0
चार s2 [] = \ u00C0; // मान 0xC3, 0x80 के साथ दो बाइट, U+00C0 की UTF-8 एन्कोडिंग
wchar_t s3[] = L"\xC0"; // A single wchar_t with the value 0x00C0
wchar_t s3 [] = एल xC0; // 0x00C0 मान के साथ एकल wchar_t
wchar_t s4[] = L"\u00C0"; // A single wchar_t with the value 0x00C0
wchar_t s4[] = एल \u00C0; // 0x00C0 मान के साथ एकल wchar_t
</syntaxhighlight>से बड़ा मान {{mono|\U0000FFFF}} द्वारा प्रतिनिधित्व किया जा सकता है {{mono|wchar_t}} यदि [[UTF-32]] एन्कोडिंग का उपयोग किया जाता है, या दो यदि UTF-16 का उपयोग किया जाता है।
</वाक्यविन्यास हाइलाइट>
 
से बड़ा मान {{mono|\U0000FFFF}} द्वारा प्रतिनिधित्व किया जा सकता है {{mono|wchar_t}} यदि [[UTF-32]] एन्कोडिंग का उपयोग किया जाता है, या दो यदि UTF-16 का उपयोग किया जाता है।


महत्वपूर्ण रूप से, सार्वभौमिक चरित्र नाम {{mono|\u00C0}} हमेशा वर्ण À को इंगित करता है, भले ही यह किस प्रकार के स्ट्रिंग शाब्दिक में उपयोग किया जाता है, या उपयोग में एन्कोडिंग। एन्कोडिंग के बावजूद, ऑक्टल और हेक्स एस्केप अनुक्रम हमेशा संख्यात्मक मानों के कुछ अनुक्रमों को इंगित करते हैं। इसलिए, सार्वभौमिक चरित्र नाम ऑक्टल और हेक्स एस्केप सीक्वेंस के पूरक हैं; जबकि ऑक्टल और हेक्स एस्केप अनुक्रम कोड इकाइयों का प्रतिनिधित्व करते हैं, सार्वभौमिक वर्ण नाम कोड बिंदुओं का प्रतिनिधित्व करते हैं, जिन्हें तार्किक वर्णों के रूप में माना जा सकता है।
महत्वपूर्ण रूप से, सार्वभौमिक चरित्र नाम {{mono|\u00C0}} हमेशा वर्ण À को इंगित करता है, भले ही यह किस प्रकार के स्ट्रिंग शाब्दिक में उपयोग किया जाता है, या उपयोग में एन्कोडिंग। एन्कोडिंग के बावजूद, ऑक्टल और हेक्स एस्केप अनुक्रम हमेशा संख्यात्मक मानों के कुछ अनुक्रमों को इंगित करते हैं। इसलिए, सार्वभौमिक चरित्र नाम ऑक्टल और हेक्स एस्केप सीक्वेंस के पूरक हैं; जबकि ऑक्टल और हेक्स एस्केप अनुक्रम कोड इकाइयों का प्रतिनिधित्व करते हैं, सार्वभौमिक वर्ण नाम कोड बिंदुओं का प्रतिनिधित्व करते हैं, जिन्हें तार्किक वर्णों के रूप में माना जा सकता है।


== यह भी देखें ==
== यह भी देखें ==
* बचने का क्रम
* एस्केप का क्रम
* [[डिग्राफ (कंप्यूटिंग)]]
* [[डिग्राफ (कंप्यूटिंग)]]


Line 126: Line 117:
* {{cite book |author-last=Lafore |author-first=Robert |author-link=Robert Lafore |date=2001 |title=Object-Oriented Programming in Turbo C++ |publisher=Galgotia Publications |isbn=978-8-18562322-1 |edition=1}}
* {{cite book |author-last=Lafore |author-first=Robert |author-link=Robert Lafore |date=2001 |title=Object-Oriented Programming in Turbo C++ |publisher=Galgotia Publications |isbn=978-8-18562322-1 |edition=1}}


[[Category: सी (प्रोग्रामिंग भाषा)]] [[Category: नियंत्रण वर्ण]]
[[Category: Machine Translated Page]]
[[Category:Created On 06/02/2023]]
[[Category:Created On 06/02/2023]]
[[Category:Lua-based templates]]
[[Category:Machine Translated Page]]
[[Category:Pages with script errors]]
[[Category:Short description with empty Wikidata description]]
[[Category:Templates Vigyan Ready]]
[[Category:Templates that add a tracking category]]
[[Category:Templates that generate short descriptions]]
[[Category:Templates using TemplateData]]
[[Category:नियंत्रण वर्ण]]
[[Category:सी (प्रोग्रामिंग भाषा)]]

Latest revision as of 12:51, 14 March 2023

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

C में, सभी एस्केप सीक्वेंस में दो या दो से अधिक वर्ण होते हैं, जिनमें से पहला बैकस्लैश \ (जिसे एस्केप कैरेक्टर कहा जाता है) है, शेष वर्ण एस्केप कैरेक्टर की व्याख्या निर्धारित करते हैं। उदाहरण के लिए, \n एस्केप सीक्वेंस है जो नई पंक्ति स्वरूप को दर्शाता है।

प्रेरणा

मान लीजिए कि हम हैलो, को एक लाइन पर, और उसके बाद वर्ल्ड!अगली पंक्ति पर प्रिंट करना चाहते हैं। निम्नानुसार एक शाब्दिक के रूप में मुद्रित होने वाली स्ट्रिंग का प्रतिनिधित्व करने का प्रयास किया जा सकता है:

#include <stdio.h>
int main() {
    printf("Hello,
world!");
}

यह C में मान्य नहीं है, क्योंकि स्ट्रिंग शाब्दिक कई तार्किक स्रोत पंक्तियों को फैला नहीं सकता है। इसके संख्यात्मक मान ( एएससीआईआई में 0x0A) का उपयोग करके न्यूलाइन वर्ण को प्रिंट करके इसके आसपास काम किया जा सकता है,

#include <stdio.h>
int main() {
    printf("Hello,%cworld!", 0x0A);
}

यह प्रोग्राम Hello, को प्रिंट करने का निर्देश देता है, उसके बाद बाइट जिसका संख्यात्मक मान 0x0A, है, जिसके बाद world! है। जबकि यह वास्तविक में तब काम करेगा जब मशीन ASCII एन्कोडिंग का उपयोग करती है, यह उन सिस्टम पर काम नहीं करेगी जो अन्य एन्कोडिंग का उपयोग करते हैं, जिनके पास न्यूलाइन कैरेक्टर के लिए अलग संख्यात्मक मान है। यह अच्छा समाधान भी नहीं है क्योंकि यह अभी भी शाब्दिक के अंदर न्यूलाइन वर्ण का प्रतिनिधित्व करने की अनुमति नहीं देता है, और इसके बजाय प्रिंटफ के शब्दार्थ का लाभ उठाता है। इन समस्याओं को हल करने और सिस्टम के बीच अधिकतम पोर्टेबिलिटी सुनिश्चित करने के लिए, सी एक शाब्दिक के अंदर \n को न्यूलाइन वर्ण के रूप में व्याख्या करता है, जो कुछ भी लक्ष्य प्रणाली पर हो सकता है:

#include <stdio.h>
int main() {
    printf("Hello,\nworld!");
}

इस कोड में, एस्केप सीक्वेंस \n अक्षर n के बाद बैकस्लैश के लिए खड़ा नहीं होता है, क्योंकि बैकस्लैश सामान्य तरीके से "एस्केप" का कारण बनता है, जिसकी व्याख्या कंपाइलर द्वारा की जाती है। बैकस्लैश को देखने के बाद, कंपाइलर किसी अन्य चरित्र से एस्केप सीक्वेंस को पूरा करने की अपेक्षा करता है, और फिर एस्केप सीक्वेंस को बाइट्स में ट्रांसलेट करता है, जिसका प्रतिनिधित्व करने का इरादा है। इस प्रकार, ""Hello,\nworld!" एक एम्बेडेड न्यूलाइन के साथ एक स्ट्रिंग का प्रतिनिधित्व करता है, भले ही इसका उपयोग printf के अंदर या कहीं और किया गया हो।

यह इस मुद्दे को उठाता है कि शाब्दिक के अंदर वास्तविकिक बैकस्लैश का प्रतिनिधित्व कैसे किया जाए। यह एस्केप सीक्वेंस \\ का उपयोग करके किया जाता है , जैसा कि अगले भाग में देखा गया है।

कुछ भाषाओं में एस्केप सीक्वेंस नहीं होते हैं, उदाहरण के लिए पास्कल (प्रोग्रामिंग भाषा)। इसके बजाय नई पंक्ति सहित कमांड का उपयोग किया जाएगा (writeln नई पंक्ति शामिल है, write इसे बाहर करता है)।

writeln('Hello');
write('world!');

एस्केप के क्रम की तालिका

निम्नलिखित एस्केप सीक्वेंस को मानक सी में परिभाषित किया गया है। यह तालिका उन मानों को भी दिखाती है जिन्हें वे ASCII में मैप करते हैं। हालाँकि, इन एस्केप सीक्वेंस का उपयोग C कंपाइलर के साथ किसी भी सिस्टम पर किया जा सकता है, और यदि सिस्टम ASCII पर आधारित वर्ण एन्कोडिंग का उपयोग नहीं करता है, तो यह विभिन्न मानों पर मैप कर सकता है।

एस्केप का क्रम ASCII में हेक्स मान वर्ण का प्रतिनिधित्व किया
\a 07 अलर्ट (बीप, बेल) (C89 में जोड़ा गया)[1]
\b 08 बैकस्पेस
\enote 1 1B एस्केप कैरेक्टर
\f 0C फॉर्मफीड पेज ब्रेक
\n 0A न्यूलाइन (लाइन फीड); नीचे नोट्स देखें
\r 0D Carriage Return
\t 09 क्षैतिज टैब
\v 0B लंबवत टैब
\\ 5C बैकस्लैश
\' 27 एपोस्ट्रोफी या एकल उद्धरण चिह्न
\" 22 दोहरा उद्धरण चिह्न
\? 3F प्रश्न चिह्न ( ट्रिग्राफ से बचने के लिए प्रयुक्त)
\nnnnote 2 कोई वह बाइट जिसका संख्यात्मक मान nnn द्वारा दिया जाता है, एक ऑक्टल संख्या के रूप में व्याख्या की जाती है
\xhh… कोई वह बाइट जिसका संख्यात्मक मान hh… द्वारा दिया जाता है, एक हेक्साडेसिमल संख्या के रूप में व्याख्या की जाती है
\uhhhhnote 3 कोई नहीं 10000 हेक्साडेसिमल से नीचे यूनिकोड कोड बिंदु (C99 में जोड़ा गया) [1]: 26 
\Uhhhhhhhhnote 4 कोई नहीं यूनिकोड कोड बिंदु जहाँ h एक हेक्साडेसिमल अंक है
नोट 1।^ सामान्य अमानक कोड; नीचे नोट्स अनुभाग देखें।
नोट 2।^ एक, दो, या तीन अष्टक अंक मौजूद हो सकते हैं; नीचे नोट्स अनुभाग देखें।
नोट 3।^ \u 4 हेक्साडेसिमल अंक h लेता है; नीचे नोट्स अनुभाग देखें।
नोट 4।^ \U में 8 हेक्साडेसिमल अंक h; नीचे नोट्स अनुभाग देखें।

टिप्पणियाँ

\n एक बाइट उत्पन्न करता है, इस तथ्य के बावजूद कि प्लेटफॉर्म एक नई पंक्ति को इंगित करने के लिए एक से अधिक बाइट का उपयोग कर सकता है, जैसे कि डॉस/विंडोज सीआरएलएफ अनुक्रम, 0x0D 0x0A। डॉस और विंडोज पर 0x0A से 0x0D 0x0A में अनुवाद तब होता है जब बाइट को फ़ाइल या कंसोल पर लिखा जाता है, और पाठ फ़ाइलों को पढ़ने पर उलटा अनुवाद किया जाता है।

एक हेक्स एस्केप सीक्वेंस में \x के बाद कम से कम एक हेक्स अंक होना चाहिए, जिसमें कोई ऊपरी सीमा नहीं है; यह उतने ही हेक्स अंकों के लिए जारी है जितने कि हैं। इस प्रकार, उदाहरण के लिए, \xABCDEFG संख्यात्मक मान ABCDEF16 के साथ बाइट को दर्शाता है, उसके बाद अक्षर G आता है, जो एक हेक्स अंक नहीं है। हालाँकि, यदि परिणामी पूर्णांक मान एक बाइट में फ़िट होने के लिए बहुत बड़ा है, तो असाइन किया गया वास्तविकिक संख्यात्मक मान कार्यान्वयन-परिभाषित है। अधिकांश प्लेटफार्मों में 8-बिट चार प्रकार होते हैं, जो एक उपयोगी हेक्स एस्केप अनुक्रम को दो हेक्स अंकों तक सीमित करता है। हालाँकि, दो हेक्स अंकों से अधिक लंबे हेक्स एस्केप सीक्वेंस एक विस्तृत वर्ण या विस्तृत स्ट्रिंग शाब्दिक (एल के साथ उपसर्ग) के अंदर उपयोगी हो सकते हैं:

char s1[] = "\x12";       // single char with value 0x12 (18 in decimal)
char s1[] = "\x1234";     // single char with implementation-defined value, unless char is long enough
wchar_t s2[] = L"\x1234"; // single wchar_t with value 0x1234, provided wchar_t is long enough (16 bits suffices)

एक ऑक्टल एस्केप सीक्वेंस में \के बाद एक, दो या तीन ऑक्टल अंक होते हैं। ऑक्टल एस्केप सीक्वेंस तब समाप्त होता है जब इसमें पहले से ही तीन ऑक्टल अंक होते हैं, या अगला वर्ण ऑक्टल अंक नहीं होता है। उदाहरण के लिए, \11 एक सिंगल ऑक्टल एस्केप सीक्वेंस है, जो संख्यात्मक मान 9 (ऑक्टल में 11) के साथ एक बाइट को दर्शाता है, न कि एस्केप सीक्वेंस \1 के बाद अंक 1 बाद। हालांकि, \1111 ऑक्टल एस्केप सीक्वेंस \111 के बाद अंक 1 आता है। । संख्यात्मक मान 1 के साथ बाइट को दर्शाने के लिए, अंक 1 के बाद, कोई "\1""1" का उपयोग कर सकता है, क्योंकि C स्वचालित रूप से आसन्न स्ट्रिंग अक्षर को जोड़ता है। ध्यान दें कि कुछ तीन-अंकीय ऑक्टल एस्केप अनुक्रम एक बाइट में फ़िट होने के लिए बहुत बड़े हो सकते हैं; इसका परिणाम वास्तविक में उत्पादित बाइट के लिए कार्यान्वयन-परिभाषित मूल्य में होता है। एस्केप सीक्वेंस \0 एक आमतौर पर इस्तेमाल किया जाने वाला ऑक्टल एस्केप सीक्वेंस है, जो शून्य वर्ण के साथ, शून्य वर्ण को दर्शाता है।

गैर-मानक पलायन अनुक्रम

क्रम जैसे \z सी मानक के अनुसार वैध एस्केप सीक्वेंस नहीं है क्योंकि यह उपरोक्त तालिका में नहीं पाया जाता है। सी मानक को निदान के लिए ऐसे अमान्य एस्केप सीक्वेंस की आवश्यकता होती है (यानी, कंपाइलर को त्रुटि संदेश प्रिंट करना होगा)। इस तथ्य के बावजूद, कुछ संकलक कार्यान्वयन-परिभाषित शब्दार्थ के साथ अतिरिक्त एस्केप सीक्वेंस को परिभाषित कर सकते हैं। उदाहरण है \e एस्केप सीक्वेंस, जिसका ASCII में हेक्साडेसिमल मान के रूप में 1B है, जो एस्केप कैरेक्टर का प्रतिनिधित्व करता है, और जीएनयू संकलक संग्रह,[2] बजना और टिनी सी कंपाइलर में समर्थित है। हालाँकि इसे C मानक प्रदर्शनों की सूची में नहीं जोड़ा गया था, क्योंकि कुछ वर्ण सेटों (जैसे EBCDIC) में इसका कोई सार्थक समकक्ष नहीं है।[1]


सार्वभौमिक चरित्र नाम

C99 मानक से, C ने एस्केप सीक्वेंस का भी समर्थन किया है जो स्ट्रिंग शाब्दिक में यूनिकोड कोड बिंदुओं को दर्शाता है। इस तरह के एस्केप सीक्वेंस को यूनिवर्सल कैरेक्टर नेम कहा जाता है और इनका फॉर्म होता है \uhhhh या \Uhhhhhhhh, कहाँ h हेक्स अंक के लिए खड़ा है। माना जाने वाले अन्य पलायन अनुक्रमों के विपरीत, सार्वभौमिक वर्ण नाम से अधिक कोड इकाई में विस्तारित हो सकता है।

क्रम \uhhhh कोड बिंदु को दर्शाता है hhhh, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। क्रम \Uhhhhhhhh कोड बिंदु को दर्शाता है hhhhhhhh, हेक्साडेसिमल संख्या के रूप में व्याख्या की गई। (इसलिए, U+10000 या उच्चतर पर स्थित कोड बिंदुओं को इसके साथ चिह्नित किया जाना चाहिए \U सिंटैक्स, जबकि निम्न कोड बिंदु उपयोग कर सकते हैं \u या \U।) लक्ष्य प्रणाली पर गंतव्य प्रकार के एन्कोडिंग में कोड बिंदु को कोड इकाइयों के अनुक्रम में परिवर्तित किया जाता है। उदाहरण के लिए (जहां एन्कोडिंग UTF-8 है, और UTF-16 के लिए wchar_t):

char s1[] = "\xC0"; // A single byte with the value 0xC0, not valid UTF-8
char s2[] = "\u00C0"; // Two bytes with values 0xC3, 0x80, the UTF-8 encoding of U+00C0
wchar_t s3[] = L"\xC0"; // A single wchar_t with the value 0x00C0
wchar_t s4[] = L"\u00C0"; // A single wchar_t with the value 0x00C0

से बड़ा मान \U0000FFFF द्वारा प्रतिनिधित्व किया जा सकता है wchar_t यदि UTF-32 एन्कोडिंग का उपयोग किया जाता है, या दो यदि UTF-16 का उपयोग किया जाता है।

महत्वपूर्ण रूप से, सार्वभौमिक चरित्र नाम \u00C0 हमेशा वर्ण À को इंगित करता है, भले ही यह किस प्रकार के स्ट्रिंग शाब्दिक में उपयोग किया जाता है, या उपयोग में एन्कोडिंग। एन्कोडिंग के बावजूद, ऑक्टल और हेक्स एस्केप अनुक्रम हमेशा संख्यात्मक मानों के कुछ अनुक्रमों को इंगित करते हैं। इसलिए, सार्वभौमिक चरित्र नाम ऑक्टल और हेक्स एस्केप सीक्वेंस के पूरक हैं; जबकि ऑक्टल और हेक्स एस्केप अनुक्रम कोड इकाइयों का प्रतिनिधित्व करते हैं, सार्वभौमिक वर्ण नाम कोड बिंदुओं का प्रतिनिधित्व करते हैं, जिन्हें तार्किक वर्णों के रूप में माना जा सकता है।

यह भी देखें

संदर्भ

  1. 1.0 1.1 1.2 "Rationale for International Standard - Programming Languages - C" (PDF). 5.10. April 2003. Archived (PDF) from the original on 2016-06-06. Retrieved 2010-10-17.
  2. "6.35 The Character <ESC> in Constants". GCC 4.8.2 Manual. Archived from the original on 2019-05-12. Retrieved 2014-03-08.


अग्रिम पठन