2009-12-17 14 views
80

से स्ट्रिंग कन्वर्ट करें मैंने इस विषय पर गुमराह किया है और मैंने हर जवाब देखा है, लेकिन मुझे अभी भी यह नहीं मिला है।सी # यूटीएफ -8 से आईएसओ -885 9 -1 (लैटिन 1) एच

मूल रूप से मैं ISO-8859-1 करने के लिए UTF-8 स्ट्रिंग बदलने की आवश्यकता है और मैं इसे निम्नलिखित कोड का उपयोग कर कार्य करें:

Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
Encoding utf8 = Encoding.UTF8; 
string msg = iso.GetString(utf8.GetBytes(Message)); 

मेरे स्रोत स्ट्रिंग

Message = "ÄäÖöÕõÜü" 

है लेकिन दुर्भाग्य से मेरे परिणाम स्ट्रिंग

msg = "�ä�ö�õ�ü 

मैं यहां क्या गलत कर रहा हूं?

+3

.NET में सभी तार आंतरिक रूप से यूनिकोड वर्णों का उपयोग करके तारों को स्टोर करते हैं। "स्ट्रिंग" विंडोज़ -1252 "," आईएसओ -885 9 -1 "," यूटीएफ -8 "इत्यादि की कोई धारणा नहीं है। क्या आप अपनी स्ट्रिंग में किसी भी अक्षर को फेंकने की कोशिश कर रहे हैं जिसमें विंडोज़ में कोई प्रतिनिधित्व नहीं है -1252 कोड पेज? –

+0

@IanBoyd वास्तव में, एक [स्ट्रिंग] (https://msdn.microsoft.com/en-us/library/system.string (v = vs.110) .aspx) यूटीएफ -16 कोड इकाइयों का एक गिनती अनुक्रम है। (दुर्भाग्य से, यूनिकोड शब्द को 'एन्कोडिंग। यूनिकोड' और Win32 एपीआई में गलत तरीके से गलत किया गया है। यूनिकोड एक वर्ण सेट है, न कि एन्कोडिंग। यूटीएफ -16 यूनिकोड के लिए कई एन्कोडिंग में से एक है।) –

+0

आप गलत कार्य करते हैं: आप utf8 एन्कोडिंग में बाइट सरणी बनाएं, लेकिन आईएसओ डीकोड द्वारा उन्हें पढ़ें। यदि आप एन्कोडेड प्रतीकों के साथ स्ट्रिंग बनाना चाहते हैं तो यह सरल कॉल ** स्ट्रिंग msg = iso.GetString (iso.GetBytes (संदेश)); ** – StuS

उत्तर

121

उपयोग Encoding.Convert अपने गंतव्य एन्कोडिंग में डिकोड करने के लिए प्रयास करने से पहले बाइट सरणी समायोजित करने के लिए।

Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
Encoding utf8 = Encoding.UTF8; 
byte[] utfBytes = utf8.GetBytes(Message); 
byte[] isoBytes = Encoding.Convert(utf8, iso, utfBytes); 
string msg = iso.GetString(isoBytes); 
+4

एक लाइनर 'एन्कोडिंग। गेट एन्कोडिंग ("आईएसओ -885 9 -1") है। GetString (एन्कोडिंग। कन्वर्ट (एन्कोडिंग.यूटीएफ 8, एन्कोडिंग.गेट एन्कोडिंग (" आईएसओ -885 9 -1 "), एन्कोडिंग .UTF8.GetBytes (myString))) –

+0

यदि आप स्वयं को सी #/नेट के अंदर स्ट्रिंग बना रहे हैं, तो यह कोड 100% सही नहीं है, आपको यूटीएफ -16 से एन्कोड करने की आवश्यकता है (जो परिवर्तनीय "यूनिकोड" है)। क्योंकि यह डिफ़ॉल्ट है। तो ऊपर दिए गए कोड में यूटीएफ 8 को यूनिकोड में बदला जाना है। – goamn

7

आपको स्ट्रिंग के स्रोत को पहले स्थान पर ठीक करने की आवश्यकता है।

.NET में एक स्ट्रिंग वास्तव में केवल 16-बिट यूनिकोड कोड-पॉइंट्स, वर्णों की एक सरणी है, इसलिए कोई स्ट्रिंग किसी विशेष एन्कोडिंग में नहीं है।

यह तब होता है जब आप उस स्ट्रिंग को लेते हैं और इसे बाइट्स के सेट में परिवर्तित करते हैं जो एन्कोडिंग खेल में आता है।

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

क्या आप हमें बता सकते हैं कि मूल स्ट्रिंग कहां से आती है, और आपको क्यों लगता है कि इसे गलत तरीके से एन्कोड किया गया है?

+0

यह सीधे App.config से आ रहा है और मैं डिफ़ॉल्ट रूप से यह UTF8 सोच रहा था। धन्यवाद! –

+0

उस फ़ाइल का एन्कोडिंग प्रभावित हो सकता है कि फ़ाइल को कैसे व्याख्या किया जाता है, इसलिए मैं इसे देखता हूं। –

+2

अगर मैं गलत हूं, तो मुझे सही करें, लेकिन मेरी समझ यह है कि, तकनीकी रूप से यह "किसी भी विशेष एन्कोडिंग में नहीं है", एक .NET स्ट्रिंग एक बाइट सरणी है जो बाइट के लिए बाइट के लिए बाइट (यूटीएफ -16 फ़ाइल, बीओएम को छोड़कर)। यह सरोगेट्स का भी उसी तरह उपयोग करता है (जो एक एन्कोडिंग चाल की तरह लगता है)। बेशक, आप आम तौर पर फ़ाइलों को यूटीएफ -8 के रूप में स्टोर करना चाहते हैं लेकिन स्मृति में डेटा को 16-बिट के रूप में संसाधित करते हैं। (या 32-बिट, सरोगेट जोड़े की जटिलता से बचने के लिए, हालांकि मुझे यकीन नहीं है कि यह वास्तव में व्यवहार्य है।) –

19

मुझे लगता है कि आपकी समस्या यह है कि आप मानते हैं कि utf8 स्ट्रिंग का प्रतिनिधित्व करने वाले बाइट्स का परिणाम उसी स्ट्रिंग में होगा जब कुछ और (iso-8859-1) के रूप में व्याख्या की जाती है। और यह बस मामला नहीं है। मैं अनुशंसा करता हूं कि आप जोएल स्पॉस्की द्वारा this excellent article पढ़ लें।

+0

धन्यवाद ... करूँगा! –

+0

वास्तव में और हास्य की भावना के साथ उत्कृष्ट लेख! मैं आज काम पर एक एन्कोडिंग मुद्दा का सामना कर रहा था और इससे मुझे मदद मिली। – Pantelis

14

इस प्रयास करें:

Encoding iso = Encoding.GetEncoding("ISO-8859-1"); 
Encoding utf8 = Encoding.UTF8; 
byte[] utfBytes = utf8.GetBytes(Message); 
byte[] isoBytes = Encoding.Convert(utf8,iso,utfBytes); 
string msg = iso.GetString(isoBytes); 
+0

मुझे संदेश के स्थान पर एक ही यूटीएफ -8 संदेश क्यों मिल रहा है? मैंने स्ट्रिंग संदेश = sdjfhsjdf पास किया। फिर लैटिन डेटा प्राप्त करने के लिए वही समान आउटपुट हो रहा है। – user1237131

+0

यह मेरे लिए काम करता है। System.Text नामस्थान शामिल करना याद रखें। – Spawnrider

+2

एन्कोडिंग। कनवर्ट करने के दौरान कनवर्ट फ़ॉलबैक अपवाद फेंकता है यदि स्ट्रिंग में गैर-आईएसओ वर्ण – Tertium

4

थोड़ा अजीब कोड लगता है। UTF8 बाइट धारा तुम सब करने की जरूरत है से स्ट्रिंग प्राप्त करने के लिए है:

string str = Encoding.UTF8.GetString(utf8ByteArray); 

आप कहीं तो करने के लिए आईएसओ-8859-1 बाइट धारा को बचाने के लिए की जरूरत है तो बस का उपयोग करें: पिछले के लिए कोड की अतिरिक्त लाइन:

byte[] iso88591data = Encoding.GetEncoding("ISO-8859-1").GetBytes(str); 
+0

यह स्पष्ट रूप से सबसे सरल उत्तर है। कोड में समस्या वास्तव में है कि लेखक मानते हैं कि सी # में एक स्ट्रिंग पहले से ही एक निश्चित एन्कोडिंग का उपयोग करके "संग्रहीत" संग्रहीत किया जा सकता है, जो कि सच नहीं है; वे हमेशा यूटीएफ 16 आंतरिक रूप से होते हैं। – Nyerguds

+1

पूरी तरह से सहमत हैं। जब आपके पास पहले से ही यूटीएफ -16 है, तो इसे सही एन्कोडिंग में बनाना मुश्किल है, क्योंकि जब आपने गलत एन्कोडिंग के साथ स्ट्रिंग करने के लिए बाइट सरणी को परिवर्तित किया है तो पहले से ही जानकारी का नुकसान हो रहा है। –

0

बस नेथन के समाधान का उपयोग किया और यह ठीक काम करता है। मैं यूनिकोड को ISO-8859-1 बदलने की जरूरत:

string isocontent = Encoding.GetEncoding("ISO-8859-1").GetString(fileContent, 0, fileContent.Length); 
byte[] isobytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(isocontent); 
byte[] ubytes = Encoding.Convert(Encoding.GetEncoding("ISO-8859-1"), Encoding.Unicode, isobytes); 
return Encoding.Unicode.GetString(ubytes, 0, ubytes.Length); 
0
Encoding targetEncoding = Encoding.GetEncoding(1252); 
// Encode a string into an array of bytes. 
Byte[] encodedBytes = targetEncoding.GetBytes(utfString); 
// Show the encoded byte values. 
Console.WriteLine("Encoded bytes: " + BitConverter.ToString(encodedBytes)); 
// Decode the byte array back to a string. 
String decodedString = Encoding.Default.GetString(encodedBytes); 
-5

यहाँ आईएसओ-8859-9 के लिए एक नमूना है,

protected void btnKaydet_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.Buffer = true; 
    Response.ContentType = "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet"; 
    Response.AddHeader("Content-Disposition", "attachment; filename=XXXX.doc"); 
    Response.ContentEncoding = Encoding.GetEncoding("ISO-8859-9"); 
    Response.Charset = "ISO-8859-9"; 
    EnableViewState = false; 


    StringWriter writer = new StringWriter(); 
    HtmlTextWriter html = new HtmlTextWriter(writer); 
    form1.RenderControl(html); 


    byte[] bytesInStream = Encoding.GetEncoding("iso-8859-9").GetBytes(writer.ToString()); 
    MemoryStream memoryStream = new MemoryStream(bytesInStream); 


    string msgBody = ""; 
    string Email = "[email protected]"; 
    SmtpClient client = new SmtpClient("mail.xxxxx.org"); 
    MailMessage message = new MailMessage(Email, "[email protected]", "ONLINE APP FORM WITH WORD DOC", msgBody); 
    Attachment att = new Attachment(memoryStream, "XXXX.doc", "application/vnd.openxmlformatsofficedocument.wordprocessingml.documet"); 
    message.Attachments.Add(att); 
    message.BodyEncoding = System.Text.Encoding.UTF8; 
    message.IsBodyHtml = true; 
    client.Send(message);} 
संबंधित मुद्दे