C # UTF-8 से ISO-8859-1 (लैटिन 1) H में कनवर्ट करें


103

मैंने इस विषय पर गुगली की है और मैंने हर उत्तर पर ध्यान दिया है, लेकिन मुझे अभी भी यह नहीं मिला है।

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

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

मेरा स्रोत स्ट्रिंग है

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

लेकिन दुर्भाग्य से मेरा रिजल्ट स्ट्रिंग बन जाता है

msg = "�ä�ö�õ�ü

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


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

1
@IanBoyd वास्तव में, एक स्ट्रिंग UTF-16 कोड इकाइयों की एक गिनी गई अनुक्रम है। (दुर्भाग्य से, यूनिकोड शब्द को गलत तरीके से Encoding.Unicodeऔर Win32 एपीआई में गलत किया गया है। यूनिकोड एक वर्ण सेट है, एन्कोडिंग नहीं है। यूटीएफ -16 यूनिकोड के लिए कई एन्कोडिंग में से एक है।)
टॉम ब्लोडेट

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

जिसे मोजिबेक कहा जाता है।
रिक जेम्स

मुझे लगता है कि डेनियल क्या कह रहा है कि MessageUTF-8 से डिकोड किया गया था। यह मानते हुए कि इस भाग ने सही ढंग से काम किया है, लैटिन -1 में बदलना उतना ही सरल है जितना कि byte[] bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(Message)। फिर, जैसे स्टुएस कहता है, आप लैटिन -1 बाइट्स को वापस यूटीएफ -16 में बदल सकते हैंEncoding.GetEncoding("ISO-8859-1").GetString(bytes)
क्वर्टी

जवाबों:


176

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

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);

7
एक लाइनर हैEncoding.GetEncoding("ISO-8859-1").GetString(Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8.GetBytes(myString)))

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

मैं इसका उपयोग करने की सलाह देता हूं: iso = Encoding.GetEncoding ("ISO-8859-9") एन्कोडिंग; क्योंकि तुर्की एन्कोडिंग लैटिन से विस्तारित सभी वर्णमाला को शामिल करता है।
फुअत

26

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


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

16

इसे इस्तेमाल करे:

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);

मैं एक ही utf-8 संदेश क्यों प्राप्त कर रहा हूं? संदेश के स्थान पर मैंने स्ट्रिंग संदेश = <name> sdjfhsjdf </ name> पारित किया है। उसी तरह का आउटपुट संदेश में मिल रहा है।
user1237131

यह मेरे लिए काम करता है। System.Text नामस्थान को शामिल करना याद रखें।
स्पॉनट्राइडर

2
एन्कोडिंग.कॉन्वर्ट
थ्रेडबैक

8

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

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

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

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

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


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

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

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

6

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

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

यदि आपको iso-8859-1 बाइट स्ट्रीम को कहीं पर सहेजने की आवश्यकता है, तो बस उपयोग करें: पिछले के लिए कोड की अतिरिक्त पंक्ति:

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

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

1
पूरी तरह से सहमत। जब आपके पास पहले से ही UTF-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

यहाँ ISO-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 = "mail@xxxxxx.org";
    SmtpClient client = new SmtpClient("mail.xxxxx.org");
    MailMessage message = new MailMessage(Email, "mail@someone.com", "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);}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.