एन्कोडिंग। डीफ़ॉल्ट का उपयोग क्यों नहीं किया जाना चाहिए ...
@ रान्डेल का उत्तर उपयोग करता है Encoding.Default
, हालाँकि Microsoft इसके खिलाफ चेतावनी देता है :
अलग-अलग कंप्यूटर डिफॉल्ट के रूप में अलग-अलग एनकोडिंग का उपयोग कर सकते हैं, और एक कंप्यूटर पर डिफ़ॉल्ट एन्कोडिंग बदल सकते हैं। यदि आप कंप्यूटर के बीच स्ट्रीम किए गए डेटा को एनकोड और डिकोड करने के लिए डिफ़ॉल्ट एन्कोडिंग का उपयोग करते हैं या एक ही कंप्यूटर पर अलग-अलग समय पर पुनर्प्राप्त किया जाता है, तो यह उस डेटा का गलत तरीके से अनुवाद कर सकता है। इसके अलावा, डिफ़ॉल्ट संपत्ति द्वारा लौटाए गए एन्कोडिंग कोड पृष्ठ द्वारा समर्थित वर्णों के लिए असमर्थित वर्णों को मैप करने के लिए सर्वश्रेष्ठ-फिटबैक का उपयोग करता है। इन कारणों से, डिफ़ॉल्ट एन्कोडिंग का उपयोग करने की अनुशंसा नहीं की जाती है। यह सुनिश्चित करने के लिए कि एन्कोडेड बाइट्स को ठीक से डिकोड किया गया है, आपको यूनिकोड एन्कोडिंग का उपयोग करना चाहिए, जैसे UTF8Encoding या UnicodeEncoding। आप यह सुनिश्चित करने के लिए उच्च-स्तरीय प्रोटोकॉल का भी उपयोग कर सकते हैं कि एन्कोडिंग और डिकोडिंग के लिए एक ही प्रारूप का उपयोग किया जाता है।
डिफ़ॉल्ट एन्कोडिंग क्या है, इसकी जांच करने के लिए Encoding.Default.WindowsCodePage
(मेरे मामले में 1250 - और दुख की बात है कि CP1250 एन्कोडिंग का कोई पूर्वनिर्धारित वर्ग नहीं है, लेकिन वस्तु को पुनः प्राप्त किया जा सकता है Encoding.GetEncoding(1250)
)।
Encoding.ASCII
7 बिट है, इसलिए यह मेरे मामले में भी काम नहीं करता है:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... और इसके बजाय UTF-8 एन्कोडिंग का उपयोग क्यों किया जाना चाहिए ...
डिफ़ॉल्ट एन्कोडिंग भ्रामक है: .NET वास्तविक रूप से हर जगह UTF-8 का उपयोग करता है (8bit एन्कोडिंग 20. सदी के अंत तक अप्रचलित हो गया, जाँच करें अर्थात Console.OutputEncoding.EncodingName
*) इसलिए कोड में परिभाषित हर निरंतर आप UTF-8 डिफ़ॉल्ट रूप से एन्कोडेड हैं - इसलिए यह तब तक उपयोग किया जाना चाहिए जब तक कि डेटा स्रोत विभिन्न एन्कोडिंग में न हो।
* यह मेरे मामले में UTF-8 है जो एक सीधा झूठ है: chcp
विंडोज़ कंसोल से (cmd) 852 लौटता है - और इसे बदला नहीं जाना चाहिए, क्योंकि स्थानीयकृत सिस्टम कमांड (जैसे पिंग) में यह कोडपेज हार्डकोड है
Microsoft की अनुशंसा के बाद:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
दूसरों द्वारा अनुशंसित एक उदाहरण uf UTF-8 एन्कोडिंग है और इसका उपयोग सीधे या के रूप में भी किया जा सकता है
var utf8 = Encoding.UTF8 as UTF8Encoding;
... लेकिन इसका उपयोग हमेशा नहीं किया जाता है
बाइट सरणियों के लिए एन्कोडिंग को पश्चिमी देशों के यूनिकोड में "बस काम" करना चाहिए, लेकिन जैसे ही आप अपने कार्यक्रम को कुछ कम-समर्थित क्षेत्रों (जैसे पूर्वी यूरोप में) में स्थानांतरित करते हैं, यह एक वास्तविक गड़बड़ है: चेक गणराज्य में विंडोज डिफॉल्ट का उपयोग करता है (2020 में!) MS गैर-मानक 852 (उर्फ लैटिन -2) कंसोल के लिए, 1250 Windows OEM के रूप में, UTF-8 (65001) .NET (और अन्य) नए डिफ़ॉल्ट के रूप में और हमें ध्यान रखना चाहिए कि कुछ पश्चिमी यूरोपीय संघ 8bit डेटा अभी भी 1252 में है, जबकि पूर्वी यूरोप के लिए पुराने 8bit पश्चिमी मानक ISO-8859-2 (उर्फ लैटिन -2, लेकिन 852 के रूप में समान लैटिन -2 नहीं था)। ASCII का उपयोग करने का अर्थ है टोफू और 'से भरा पाठ?' यहाँ। इसलिए 21 वीं सदी के उत्तरार्ध तक, कृपया UTF-8 को स्पष्ट रूप से सेट करें ।
searchResult.Properties["user"][0]
? इसेbyte[]
पहली बार कास्टिंग करने की कोशिश करें