दिलचस्प पोस्ट
MATLAB से अजगर समारोह को कॉल करें एक यूट्यूब एम्बेड के लिए स्वत: पूर्ण स्क्रीन एकल या दोहरे उद्धरण से घिरा नहीं हुआ स्थान का उपयोग कर स्ट्रिंग को विभाजित करने के लिए रेगेक्स कैसे वास्तविक डाउनलोड फ़ोल्डर स्थान को छिपाने के लिए 1 डी सरणी से कुशल नीलम 2 डी सरणी निर्माण आप SQL सर्वर 2005 डेटाबेस में सभी मौजूदा कनेक्शन कैसे मार सकते हैं? जावा आर एकीकरण? घटक के लिए COM वर्ग फ़ैक्टरी को पुनर्प्राप्त करना विफल रहा डीपी, पीएक्स, एसपी एक-दूसरे के बीच कन्वर्ट करने के लिए, विशेष रूप से डीपी और सपा कैसे? CSS3 कैल के साथ कम आक्रामक संकलन सस्पिप और नीच के बीच संबंध जेपीए हाइबरनेट एक-से-एक संबंध अजगर कुंजीशब्द "के साथ" के लिए प्रयोग किया जाता है? ASP.NET MVC में डिफ़ॉल्ट सत्यापन त्रुटि संदेश कैसे परिवर्तित करें? फार्म सबमिट पर एक नई विंडो कैसे खोलें

सी #: डिकोडिंग के लिए क्लास उद्धृत छापने योग्य एन्कोडिंग?

क्या सी # में एक मौजूदा वर्ग है जो String को उद्धृत-मुद्रणीय एन्कोडिंग में कनवर्ट कर सकता है? एन्कोडिंग पर अधिक जानकारी प्राप्त करने के लिए ऊपर दिए गए लिंक पर क्लिक करें

निम्नलिखित आपकी सुविधा के लिए ऊपर दिए गए लिंक से उद्धृत किया गया है

कोई 8-बिट बाइट मान 3 वर्णों के साथ एन्कोड किया जा सकता है, एक "=" बाइट के अंकीय मूल्य का प्रतिनिधित्व करने वाला दो हेक्साडेसिमल अंक (0-9 या ए-एफ) के बाद। उदाहरण के लिए, एक यूएस-एएससीआईआई फॉर्म फीड कैरेक्टर (दशमलव मान 12) का प्रतिनिधित्व "= 0 सी" द्वारा किया जा सकता है, और एक यूएस-एएससीआईआई बराबर चिह्न (दशमलव मान 61) "= 3 डी" द्वारा दर्शाया गया है। इस फैशन में प्रिंट करने योग्य ASCII वर्ण या पंक्ति वर्णों के अंत के अलावा सभी वर्ण इनकोडेड होने चाहिए।

सभी प्रिंट करने योग्य ASCII वर्ण (33 और 126 के बीच दशमलव मान) का प्रतिनिधित्व खुद के द्वारा "=" (दशमलव 61) को छोड़कर किया जा सकता है।

एएससीआईआई टैब और स्पेस वर्ण, दशमलव मूल्य 9 और 32, स्वयं द्वारा प्रतिनिधित्व किया जा सकता है, सिवाय इसके कि अगर ये अक्षर एक पंक्ति के अंत में दिखाई देते हैं यदि इन अक्षरों में से कोई एक पंक्ति के अंत में प्रकट होता है तो इसे "= 09" (टैब) या "= 20" (अंतरिक्ष) के रूप में एन्कोड किया जाना चाहिए।

यदि एन्कोडेड डेटा में सार्थक रेखा विराम होता है, तो उन्हें एएससीआईआई सीआर एलएफ अनुक्रम के रूप में एन्कोड किया जाना चाहिए, उनके मूल बाइट मान के रूप में नहीं। इसके विपरीत यदि बाइट मूल्य 13 और 10 के अंत के अलावा अन्य अर्थ हैं तो उन्हें 0 डी और = 0 ए के रूप में एन्कोड किया जाना चाहिए।

उद्धृत-प्रिंट करने योग्य एन्कोडेड डेटा की रेखाएं 76 वर्णों से अधिक नहीं होनी चाहिए। एन्कोडेड पाठ को बदलने के बिना इस आवश्यकता को पूरा करने के लिए, वांछित के रूप में सॉफ्ट लाइन ब्रेक जोड़ सकते हैं एक नरम लाइन ब्रेक में एन्कोडेड रेखा के अंत में "=" होता है, और डिकोड किए गए पाठ में एक लाइन ब्रेक का कारण नहीं है।

Solutions Collecting From Web of "सी #: डिकोडिंग के लिए क्लास उद्धृत छापने योग्य एन्कोडिंग?"

ऐसा करने के लिए फ़्रेमवर्क पुस्तकालयों में कार्यक्षमता है, लेकिन यह स्पष्ट रूप से उजागर नहीं हुआ है। कार्यान्वयन आंतरिक श्रेणी System.Net.Mime.QuotedPrintableStream । यह क्लास DecodeBytes नामक एक विधि को परिभाषित करता है जो कि आप क्या चाहते हैं। विधि केवल एक ही विधि द्वारा प्रयुक्त प्रतीत होती है जिसका उपयोग माइम हेडर को डीकोड करने के लिए किया जाता है। यह विधि भी आंतरिक है, लेकिन इसे कुछ स्थानों में काफी सीधे कहा जाता है, जैसे कि Attachment.Name । नाम सेटर प्रदर्शन:

 using System; using System.Net.Mail; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Attachment attachment = Attachment.CreateAttachmentFromString("", "=?iso-8859-1?Q?=A1Hola,_se=F1or!?="); Console.WriteLine(attachment.Name); } } } 

उत्पादन का उत्पादन करता है:

¡होला, _señor!

आपको कुछ परीक्षण करना पड़ सकता है यह सुनिश्चित करने के लिए कि कैरिएस रिटर्न, आदि को सही तरीके से इलाज किया गया है, हालांकि एक त्वरित परीक्षण में मुझे ऐसा लगता है हालांकि, यह कार्यक्षमता पर भरोसा करने के लिए बुद्धिमान नहीं हो सकता है जब तक कि आपके उपयोग-केस एक एमआईएमई हेडर स्ट्रिंग को डिकोड करने के लिए पर्याप्त न हो, जो आपको नहीं लगता कि यह पुस्तकालय में किए गए किसी भी परिवर्तन से टूट जाएगा। आप अपने खुद के उद्धृत-छापने योग्य डिकोडर लिखकर बेहतर हो सकते हैं

मैंने मार्टिन मर्फी के समाधान को बढ़ाया और मुझे आशा है कि यह हर मामले में काम करेगी।

 private static string DecodeQuotedPrintables(string input, string charSet) { if (string.IsNullOrEmpty(charSet)) { var charSetOccurences = new Regex(@"=\?.*\?Q\?", RegexOptions.IgnoreCase); var charSetMatches = charSetOccurences.Matches(input); foreach (Match match in charSetMatches) { charSet = match.Groups[0].Value.Replace("=?", "").Replace("?Q?", ""); input = input.Replace(match.Groups[0].Value, "").Replace("?=", ""); } } Encoding enc = new ASCIIEncoding(); if (!string.IsNullOrEmpty(charSet)) { try { enc = Encoding.GetEncoding(charSet); } catch { enc = new ASCIIEncoding(); } } //decode iso-8859-[0-9] var occurences = new Regex(@"=[0-9A-Z]{2}", RegexOptions.Multiline); var matches = occurences.Matches(input); foreach (Match match in matches) { try { byte[] b = new byte[] { byte.Parse(match.Groups[0].Value.Substring(1), System.Globalization.NumberStyles.AllowHexSpecifier) }; char[] hexChar = enc.GetChars(b); input = input.Replace(match.Groups[0].Value, hexChar[0].ToString()); } catch { ;} } //decode base64String (utf-8?B?) occurences = new Regex(@"\?utf-8\?B\?.*\?", RegexOptions.IgnoreCase); matches = occurences.Matches(input); foreach (Match match in matches) { byte[] b = Convert.FromBase64String(match.Groups[0].Value.Replace("?utf-8?B?", "").Replace("?UTF-8?B?", "").Replace("?", "")); string temp = Encoding.UTF8.GetString(b); input = input.Replace(match.Groups[0].Value, temp); } input = input.Replace("=\r\n", ""); return input; } 

मैंने यह लिखा असली त्वरित

  public static string DecodeQuotedPrintables(string input) { var occurences = new Regex(@"=[0-9A-H]{2}", RegexOptions.Multiline); var matches = occurences.Matches(input); foreach (Match match in matches) { char hexChar= (char) Convert.ToInt32(match.Groups[0].Value.Substring(1), 16); input =input.Replace(match.Groups[0].Value, hexChar.ToString()); } return input.Replace("=\r\n", ""); } 

यदि आप यूटीएफ -8 एन्कोडिंग के साथ उद्धृत-प्रिंट करने योग्य डीकोडिंग कर रहे हैं तो आपको यह जानना होगा कि आप प्रत्येक उद्धृत प्रिंट करने योग्य अनुक्रम को एक-एक-एक-समय के रूप में व्याख्या नहीं कर सकते हैं क्योंकि दूसरों ने दिखाया है कि उद्धृत प्रिंट करने योग्य पात्रों के एक साथ चलते हैं।

उदाहरण के लिए – यदि आपके पास निम्नलिखित अनुक्रम = E2 = 80 = 99 है और इसे यूटीएफ 8 के साथ एक-एक-एक-समय पर तीन "अजीब" वर्ण मिलते हैं – यदि आप इसके बजाय तीन बाइट्स बनाते हैं और तीन बाइट्स को परिवर्तित करते हैं यूटीएफ 8 एन्कोडिंग आपको एकल अपहोस्ट्राप मिलता है

जाहिर है, अगर आप एएससीआईआई एन्कोडिंग का उपयोग कर रहे हैं तो एक-एक-एक-समय में कोई समस्या नहीं है, लेकिन रन डिकोडिंग का मतलब है कि आपका कोड टेक्स्ट एन्कोडर का उपयोग किए बिना काम करेगा।

ओह, और मत भूलो = 3 डी एक विशेष मामला है जिसका अर्थ है कि आपको एक बार और जो भी हो, उसे समझना होगा … यह एक पागल हो गया है!

उम्मीद है की वो मदद करदे

  private string quotedprintable(string data, string encoding) { data = data.Replace("=\r\n", ""); for (int position = -1; (position = data.IndexOf("=", position + 1)) != -1;) { string leftpart = data.Substring(0, position); System.Collections.ArrayList hex = new System.Collections.ArrayList(); hex.Add(data.Substring(1 + position, 2)); while (position + 3 < data.Length && data.Substring(position + 3, 1) == "=") { position = position + 3; hex.Add(data.Substring(1 + position, 2)); } byte[] bytes = new byte[hex.Count]; for (int i = 0; i < hex.Count; i++) { bytes[i] = System.Convert.ToByte(new string(((string)hex[i]).ToCharArray()), 16); } string equivalent = System.Text.Encoding.GetEncoding(encoding).GetString(bytes); string rightpart = data.Substring(position + 3); data = leftpart + equivalent + rightpart; } return data; } 

यह उद्धृत प्रिंट योग्य डिकोडर महान काम करता है!

 public static byte[] FromHex(byte[] hexData) { if (hexData == null) { throw new ArgumentNullException("hexData"); } if (hexData.Length < 2 || (hexData.Length / (double)2 != Math.Floor(hexData.Length / (double)2))) { throw new Exception("Illegal hex data, hex data must be in two bytes pairs, for example: 0F,FF,A3,... ."); } MemoryStream retVal = new MemoryStream(hexData.Length / 2); // Loop hex value pairs for (int i = 0; i < hexData.Length; i += 2) { byte[] hexPairInDecimal = new byte[2]; // We need to convert hex char to decimal number, for example F = 15 for (int h = 0; h < 2; h++) { if (((char)hexData[i + h]) == '0') { hexPairInDecimal[h] = 0; } else if (((char)hexData[i + h]) == '1') { hexPairInDecimal[h] = 1; } else if (((char)hexData[i + h]) == '2') { hexPairInDecimal[h] = 2; } else if (((char)hexData[i + h]) == '3') { hexPairInDecimal[h] = 3; } else if (((char)hexData[i + h]) == '4') { hexPairInDecimal[h] = 4; } else if (((char)hexData[i + h]) == '5') { hexPairInDecimal[h] = 5; } else if (((char)hexData[i + h]) == '6') { hexPairInDecimal[h] = 6; } else if (((char)hexData[i + h]) == '7') { hexPairInDecimal[h] = 7; } else if (((char)hexData[i + h]) == '8') { hexPairInDecimal[h] = 8; } else if (((char)hexData[i + h]) == '9') { hexPairInDecimal[h] = 9; } else if (((char)hexData[i + h]) == 'A' || ((char)hexData[i + h]) == 'a') { hexPairInDecimal[h] = 10; } else if (((char)hexData[i + h]) == 'B' || ((char)hexData[i + h]) == 'b') { hexPairInDecimal[h] = 11; } else if (((char)hexData[i + h]) == 'C' || ((char)hexData[i + h]) == 'c') { hexPairInDecimal[h] = 12; } else if (((char)hexData[i + h]) == 'D' || ((char)hexData[i + h]) == 'd') { hexPairInDecimal[h] = 13; } else if (((char)hexData[i + h]) == 'E' || ((char)hexData[i + h]) == 'e') { hexPairInDecimal[h] = 14; } else if (((char)hexData[i + h]) == 'F' || ((char)hexData[i + h]) == 'f') { hexPairInDecimal[h] = 15; } } // Join hex 4 bit(left hex cahr) + 4bit(right hex char) in bytes 8 it retVal.WriteByte((byte)((hexPairInDecimal[0] << 4) | hexPairInDecimal[1])); } return retVal.ToArray(); } public static byte[] QuotedPrintableDecode(byte[] data) { if (data == null) { throw new ArgumentNullException("data"); } MemoryStream msRetVal = new MemoryStream(); MemoryStream msSourceStream = new MemoryStream(data); int b = msSourceStream.ReadByte(); while (b > -1) { // Encoded 8-bit byte(=XX) or soft line break(=CRLF) if (b == '=') { byte[] buffer = new byte[2]; int nCount = msSourceStream.Read(buffer, 0, 2); if (nCount == 2) { // Soft line break, line splitted, just skip CRLF if (buffer[0] == '\r' && buffer[1] == '\n') { } // This must be encoded 8-bit byte else { try { msRetVal.Write(FromHex(buffer), 0, 1); } catch { // Illegal value after =, just leave it as is msRetVal.WriteByte((byte)'='); msRetVal.Write(buffer, 0, 2); } } } // Illegal =, just leave as it is else { msRetVal.Write(buffer, 0, nCount); } } // Just write back all other bytes else { msRetVal.WriteByte((byte)b); } // Read next byte b = msSourceStream.ReadByte(); } return msRetVal.ToArray(); } 

केवल एक ही है जो मेरे लिए काम करता है

http://sourceforge.net/apps/trac/syncmldotnet/wiki/Quoted%20Printable

यदि आपको क्यूपी को डिकोड करने की आवश्यकता है, तो ऊपर दिए गए लिंक से उन तीन कार्यों को अपने कोड के अंदर खींचें:

  HexDecoderEvaluator(Match m) HexDecoder(string line) Decode(string encodedText) 

और फिर बस:

 var humanReadable = Decode(myQPString); 

का आनंद लें

मैं एक गतिशील समाधान की तलाश कर रहा था और 2 दिन अलग-अलग समाधानों की कोशिश कर रहा था। यह समाधान जापानी वर्णों और अन्य मानक वर्ण सेटों का समर्थन करेगा

 private static string Decode(string input, string bodycharset) { var i = 0; var output = new List<byte>(); while (i < input.Length) { if (input[i] == '=' && input[i + 1] == '\r' && input[i + 2] == '\n') { //Skip i += 3; } else if (input[i] == '=') { string sHex = input; sHex = sHex.Substring(i + 1, 2); int hex = Convert.ToInt32(sHex, 16); byte b = Convert.ToByte(hex); output.Add(b); i += 3; } else { output.Add((byte)input[i]); i++; } } if (String.IsNullOrEmpty(bodycharset)) return Encoding.UTF8.GetString(output.ToArray()); else { if (String.Compare(bodycharset, "ISO-2022-JP", true) == 0) return Encoding.GetEncoding("Shift_JIS").GetString(output.ToArray()); else return Encoding.GetEncoding(bodycharset).GetString(output.ToArray()); } } 

तब आप फ़ंक्शन को कॉल कर सकते हैं

 Decode("=E3=82=AB=E3=82=B9=E3", "utf-8") 

यह मूल रूप से यहां पाया गया था

बेहतर समाधान

  private static string DecodeQuotedPrintables(string input, string charSet) { try { enc = Encoding.GetEncoding(CharSet); } catch { enc = new UTF8Encoding(); } var occurences = new Regex(@"(=[0-9A-Z]{2}){1,}", RegexOptions.Multiline); var matches = occurences.Matches(input); foreach (Match match in matches) { try { byte[] b = new byte[match.Groups[0].Value.Length / 3]; for (int i = 0; i < match.Groups[0].Value.Length / 3; i++) { b[i] = byte.Parse(match.Groups[0].Value.Substring(i * 3 + 1, 2), System.Globalization.NumberStyles.AllowHexSpecifier); } char[] hexChar = enc.GetChars(b); input = input.Replace(match.Groups[0].Value, hexChar[0].ToString()); } catch { ;} } input = input.Replace("=\r\n", "").Replace("=\n", "").Replace("?=", ""); return input; } 
 public static string DecodeQuotedPrintables(string input, Encoding encoding) { var regex = new Regex(@"\=(?<Symbol>[0-9A-Z]{2})", RegexOptions.Multiline); var matches = regex.Matches(input); var bytes = new byte[matches.Count]; for (var i = 0; i < matches.Count; i++) { bytes[i] = Convert.ToByte(matches[i].Groups["Symbol"].Value, 16); } return encoding.GetString(bytes); } 

कभी-कभी एक EML फ़ाइल में स्ट्रिंग कई एन्कोडेड भागों द्वारा रची जाती है। इन मामलों के लिए डेव की विधि का उपयोग करने के लिए यह एक फ़ंक्शन है:

 public string DecodeQP(string codedstring) { Regex codified; codified=new Regex(@"=\?((?!\?=).)*\?=", RegexOptions.IgnoreCase); MatchCollection setMatches = codified.Matches(cadena); if(setMatches.Count > 0) { Attachment attdecode; codedstring= ""; foreach (Match match in setMatches) { attdecode = Attachment.CreateAttachmentFromString("", match.Value); codedstring+= attdecode.Name; } } return codedstring; }