दिलचस्प पोस्ट
घोषित किए जाने से पहले जावास्क्रिप्ट मूल्य को संदर्भित करना – कोई यह समझा सकता है राइनो.मॉक्स का प्रयोग करके स्थैतिक तरीकों का मजाक उड़ा रहा है Excel फ़ाइल में डेटाटाइल निर्यात करें मैं पायथन में एक 'एन्यूम' का प्रतिनिधित्व कैसे कर सकता हूं? PHP के साथ जीसीएम (Google क्लाउड मेसेजिंग) == या .Equals () मैं पर्ल वेरिएबल में एक सिस्टम कमांड के परिणाम कैसे संचित कर सकता हूं? JPanel पृष्ठभूमि के रूप में छवि को सेट करने का सबसे सरल तरीका पीएचपी जरूर मैच के जरिए सरणी की चाबियाँ अनसेट करें सी ++ सरणी के सदस्यों को कॉपी नियंत्रण कार्यों में कैसे संभाला जाता है? जेनेरिक्स एक्लिप्से में संकलित और चलाता है, लेकिन जवाक में संकलन नहीं करता ग्रहण स्वचालित रूप से संसाधनों को ताज़ा कर सकता है? लिनक्स पर एक जेएनआई आवेदन के लिए गतिशील पुस्तकालय कैसे संकलित करें? मैं एक मोबाइल डिवाइस से एंड्रॉइड में एक फाइल एचटीटीपी के जरिए एक फाइल कैसे भेजूं? जब जावा जेनेरिक्स की आवश्यकता होती है? टी के बजाय <T> बढ़ाता है और स्विचन के कोई नकारात्मक पहलू है?

WebClient.DownloadString () अजीब अक्षर के साथ तार देता है

मेरे पास कुछ सामग्री के साथ एक मुद्दा है जो हम एक स्क्रीन स्क्रैपिंग उपकरण के लिए वेब से डाउनलोड कर रहे हैं जो मैं बना रहा हूं।

नीचे दिए गए कोड में, वेब क्लाइंट डाउनलोड स्ट्रिंग विधि से लौटे स्ट्रिंग कुछ (सभी नहीं) वेब साइटों के लिए स्रोत डाउनलोड के लिए कुछ अजीब अक्षर देता है

मैंने हाल ही में एचटीपी हेडर को नीचे दिए हैं I पहले ही कोड एक ही प्रभाव के लिए हेडर बिना बुलाया गया था। मैंने 'एक्ट्रेस-वर्णसेट हेडर' पर बदलाव की कोशिश नहीं की है, मुझे मूलभूत चीज़ों के अलावा टेक्स्ट एन्कोडिंग के बारे में अधिक जानकारी नहीं है

वर्ण, या वर्ण अनुक्रम जो मैं संदर्भित करता हूं:

" मैं» ¿ "

तथा

" एक "

जब आप किसी वेब ब्राउज़र में "दृश्य स्रोत" का उपयोग करते हैं, तो इन अक्षरों को नहीं देखा जाता है यह क्या हो सकता है और मैं इस समस्या को कैसे सुधार सकता हूँ?

string urlData = String.Empty; WebClient wc = new WebClient(); // Add headers to impersonate a web browser. Some web sites // will not respond correctly without these headers wc.Headers.Add("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12"); wc.Headers.Add("Accept", "*/*"); wc.Headers.Add("Accept-Language", "en-gb,en;q=0.5"); wc.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); urlData = wc.DownloadString(uri); 

Solutions Collecting From Web of "WebClient.DownloadString () अजीब अक्षर के साथ तार देता है"

 ओक्टेट्स EF BB BF का विंडोज -1252 का प्रतिनिधित्व है I यह यूटीएफ -8 बाइट-ऑर्डर मार्कर है , जिसका अर्थ है कि आपका रिमोट वेब पेज यूटीएफ -8 में एन्कोड किया गया है लेकिन आप इसे पढ़ रहे हैं जैसे कि यह विंडो -1252 था डॉक्स के मुताबिक , WebClient.DownloadString Webclient.Encoding का उपयोग इसके एन्कोडिंग के रूप में करता है जब यह रिमोट संसाधन को स्ट्रिंग में कनवर्ट करता है। इसे System.Text.Encoding.UTF8 सेट करें और चीजों को सैद्धांतिक रूप से काम करना चाहिए।

जिस तरह से WebClient.DownloadString लागू किया जाता है बहुत गूंगा है। इसे प्रतिक्रिया में Content-Type हैडर से वर्ण एन्कोडिंग प्राप्त करना चाहिए, लेकिन इसके बजाय डेवलपर को उम्मीद है कि वह पहले से अपेक्षित एन्कोडिंग को बताए। मुझे नहीं पता कि इस वर्ग के डेवलपर्स क्या सोच रहे थे।

मैंने एक सहायक वर्ग बनाया है जो प्रतिक्रिया के Content-Type शीर्ष लेख से एन्कोडिंग नाम प्राप्त करता है:

 public static class WebUtils { public static Encoding GetEncodingFrom( NameValueCollection responseHeaders, Encoding defaultEncoding = null) { if(responseHeaders == null) throw new ArgumentNullException("responseHeaders"); //Note that key lookup is case-insensitive var contentType = responseHeaders["Content-Type"]; if(contentType == null) return defaultEncoding; var contentTypeParts = contentType.Split(';'); if(contentTypeParts.Length <= 1) return defaultEncoding; var charsetPart = contentTypeParts.Skip(1).FirstOrDefault( p => p.TrimStart().StartsWith("charset", StringComparison.InvariantCultureIgnoreCase)); if(charsetPart == null) return defaultEncoding; var charsetPartParts = charsetPart.Split('='); if(charsetPartParts.Length != 2) return defaultEncoding; var charsetName = charsetPartParts[1].Trim(); if(charsetName == "") return defaultEncoding; try { return Encoding.GetEncoding(charsetName); } catch(ArgumentException ex) { throw new UnknownEncodingException( charsetName, "The server returned data in an unknown encoding: " + charsetName, ex); } } } 

( UnknownEncodingException अपवाद एक कस्टम अपवाद वर्ग है, UnknownEncodingException अपवाद के लिए प्रतिस्थापित करने के लिए बेझिझक या यदि आप चाहें तो कुछ भी)

फिर WebClient क्लास के लिए निम्न एक्सटेंशन विधि चाल करेगी:

 public static class WebClientExtensions { public static string DownloadStringAwareOfEncoding(this WebClient webClient, Uri uri) { var rawData = webClient.DownloadData(uri); var encoding = WebUtils.GetEncodingFrom(webClient.ResponseHeaders, Encoding.UTF8); return encoding.GetString(rawData); } } 

तो आपके उदाहरण में आप ऐसा करेंगे:

 urlData = wc.DownloadStringAwareOfEncoding(uri); 

…और बस।

 var client = new WebClient { Encoding = System.Text.Encoding.UTF8 }; var json = client.DownloadString(url); 

मेरे मामले में लौटाए गए डेटा को जिप्प कर दिया गया था और पहले असंपीड़ित होना था, इसलिए मैंने यह जवाब उपयोगी पाया:

https://stackoverflow.com/a/34418228/74585

मेरे मामले में, मैंने भाषा, वर्णसेट इत्यादि से संबंधित कोई भी हेडर हटा दिया है। उपयोगकर्ता एजेंट और कुकी को छोड़कर इसने काम कर दिया..

  // try commenting //wc.Headers.Add("Accept-Language", "en-gb,en;q=0.5"); //wc.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7"); 

उनमें से कोई भी मेरे लिए कुछ विशेष वेबसाइटों जैसे "www.yahoo.com" के लिए काम नहीं करता। मैं अपनी समस्या का समाधान करने का एकमात्र तरीका DownloadString को OpenRead में बदल रहा था और नमूना कोड जैसे UserAgent हेडर का उपयोग कर रहा था। हालांकि, "www.varzesh3.com" जैसी कुछ साइटों ने किसी भी तरीके से काम नहीं किया!

 WebClient client = new WebClient() client.Headers.Add(HttpRequestHeader.UserAgent, ""); var stream = client.OpenRead("http://www.yahoo.com"); StreamReader sr = new StreamReader(stream); s = sr.ReadToEnd();