C# में स्ट्रिंग्स से बाइट्स बिना एन्कोडिंग के: समस्या का सही समाधान

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

यह प्रश्न Stack Overflow पर इतना लोकप्रिय क्यों है?

\n\n

यदि आपने कभी C# में कोड लिखा है और स्ट्रिंग को बाइट ऐरे में बदलने की आवश्यकता महसूस की है, तो आपने निश्चित रूप से यह प्रश्न पूछा होगा: "मुझे एन्कोडिंग क्यों बतानी चाहिए? आखिर स्ट्रिंग तो सिर्फ एक स्ट्रिंग है!"। यह प्रश्न Stack Overflow पर हज़ारों बार देखा गया है, यह कोई संयोग नहीं है। यह हम टेक्स्ट को कैसे देखते हैं और कंप्यूटर इसे कैसे देखता है के बीच मूलभूत गलतफहमी को उजागर करता है।

\n\n

इस लेख में हम सिर्फ तैयार कोड नहीं देंगे, बल्कि यह भी समझेंगे कि Encoding.UTF8.GetBytes("hello") कोई अस्थायी समाधान नहीं, बल्कि एकमात्र सही तरीका क्यों है। आप जानेंगे कि C# में स्ट्रिंग का बाइट प्रतिनिधित्व डेटा खोने के जोखिम के बिना कैसे प्राप्त करें, और "स्वचालित एन्कोडिंग चयन" के जादू के पीछे क्या छिपा है।

\n\n

"बिना एन्कोडिंग वाली स्ट्रिंग" का मिथक

\n\n

कई शुरुआती सोचते हैं कि C# में स्ट्रिंग सिर्फ बाइट्स का एक क्रम है। ऐसा नहीं है। आंतरिक रूप से .NET में string को UTF-16 (दो-बाइट वर्ण) के रूप में संग्रहीत किया जाता है। जब आप "Привет" लिखते हैं, तो मेमोरी में यह 12 बाइट्स (6 वर्ण × 2 बाइट) होता है। लेकिन यदि आप इस स्ट्रिंग को फ़ाइल, नेटवर्क या डेटाबेस में भेजने का प्रयास करते हैं, तो आपको लगभग हमेशा एक अलग प्रारूप की आवश्यकता होगी - अक्सर UTF-8।

\n\n

"बिना एन्कोडिंग" के बाइट्स प्राप्त करने का प्रयास यह पूछने जैसा है: "बिना भाषा बताए किताब का रूसी से अंग्रेज़ी में अनुवाद कैसे करें?"। असंभव। एन्कोडिंग वर्णों को बाइट्स में बदलने के नियम हैं। उनके बिना आपको बकवास मिलेगा।

\n\n

कैसे नहीं करना चाहिए (सामान्य गलती)

\n\n
string text = "Hello, мир!";\nbyte[] wrongBytes = System.Text.Encoding.Default.GetBytes(text); // बुरा!
\n\n

यह कोड डिफ़ॉल्ट सिस्टम एन्कोडिंग (आमतौर पर रूसी Windows पर Windows-1251) का उपयोग करता है। यदि आप इस कोड को किसी अन्य मशीन या Linux पर चलाते हैं - तो आपको अलग बाइट्स मिलेंगे। आपका एप्लिकेशन अप्रत्याशित हो जाएगा।

\n\n

सही तरीका: स्पष्ट एन्कोडिंग निर्दिष्ट करना

\n\n

सुसंगत बाइट प्रतिनिधित्व प्राप्त करने का एकमात्र विश्वसनीय तरीका एन्कोडिंग को स्पष्ट रूप से निर्दिष्ट करना है। सबसे लोकप्रिय और अनुशंसित विकल्प UTF-8 है:

\n\n
string text = "Hello, мир!";\nbyte[] utf8Bytes = System.Text.Encoding.UTF8.GetBytes(text);\n// परिणाम: [72, 101, 108, 108, 111, 44, 32, 208, 188, 208, 184, 209, 128, 33]
\n\n

यह कोड किसी भी प्लेटफ़ॉर्म पर हमेशा एक ही परिणाम देगा। क्यों? क्योंकि UTF-8 एक अंतरराष्ट्रीय मानक है जो हर जगह समान रूप से काम करता है।

\n\n

एन्कोडिंग के अन्य विकल्प (जब उनकी आवश्यकता हो)

\n\n
    \n
  • ASCII — केवल लैटिन, 127 से अधिक सभी वर्णों को हटा देता है।
  • \n
  • Unicode (UTF-16LE) — C# का आंतरिक प्रारूप, लेकिन भंडारण के लिए अकुशल।
  • \n
  • Windows-1251 — पुराना, केवल पुराने सिस्टम के साथ संगतता के लिए।
  • \n
\n\n

99% आधुनिक कार्यों के लिए Encoding.UTF8 का उपयोग करें।

\n\n

और अगर मैं "बिना निर्दिष्ट किए" चाहता हूँ? क्या कोई हैक है?

\n\n

तकनीकी रूप से आप BitConverter.ToString() या पॉइंटर्स के साथ unsafe-कोड का उपयोग कर सकते हैं, लेकिन यह आपको मेमोरी में संग्रहीत कच्चे UTF-16 बाइट्स देगा। यह कई कारणों से एक बुरा विचार है:

\n\n
    \n
  • परिणाम प्लेटफ़ॉर्म पर निर्भर करता है (Little-Endian vs Big-Endian)।
  • \n
  • आपको लैटिन वर्णों के लिए अतिरिक्त शून्य बाइट्स मिलेंगे (प्रत्येक वर्ण 2 बाइट लेगा)।
  • \n
  • .NET संस्करण बदलने पर आंतरिक प्रतिनिधित्व बदल सकता है (असंभावित, लेकिन संभव)।
  • \n
\n\n

खतरनाक कोड का उदाहरण जिसे दोहराना नहीं चाहिए:

\n\n
unsafe\n{\n    string text = "Hello";\n    fixed (char* ptr = text)\n    {\n        byte* bytePtr = (byte*)ptr;\n        // कच्चे UTF-16 बाइट्स के साथ काम करें\n    }\n}
\n\n

यह काम करता है, लेकिन "यदि आप परिणाम नहीं समझते हैं तो आंतरिक भागों में न जाएं" के सिद्धांत का उल्लंघन करता है।

\n\n

शुरुआती लोगों के लिए सर्वोत्तम अभ्यास

ब्लॉग

पुस्तक अनुशंसाएँ