दिलचस्प पोस्ट
गैर-अल्फ़ान्यूमेरिक वर्ण कैसे निकालें? "कार्यक्रम फ़ाइलें" फ़ोल्डर के तहत फाइल लेखन अनुमति समस्या TextView में पूर्णांक मान नेविगेशनदृश्य में विस्तार योग्य LISTView को जोड़ना क्रोम एक्सटेंशन में popup.js और background.js के बीच कैसे संपर्क करें? वैकल्पिक वैरिएबल को प्रिंट करना स्विफ्ट में NSObject उपवर्ग: हैश बनाम हैश वैल्यू, है एक्वाल बनाम == कैसे बनाने के लिए Visual Studio देशी amd64 toolchain का उपयोग करें UIWebView सामग्री के साथ दृश्य (एचटीएमएल संपादन), पहली प्रतिक्रिया संभाल? मैं सी या सी ++ का उपयोग कर निर्देशिका में फाइलों की सूची कैसे प्राप्त करूं? स्वचालित रूप से विंडोज प्रॉक्सी का उपयोग करने के लिए JVM / JRE सेट करना वर्णों के बजाए सी कैरेक्टर लिटरियल इनट क्यों हैं? आर फ़ंक्शन में वैकल्पिक तर्कों को निर्दिष्ट करने के लिए "सही" तरीका क्या अधिक कुशल i ++ या ++ i है? base_url () फ़ंक्शन codeigniter में काम नहीं कर रहा है

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

वेब के समाधान से एकत्रित समाधान "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();