एंड्रॉयड। WebView और loadData


104

वेब-व्यू लोडडैट की सामग्री की सेटिंग के लिए निम्नलिखित विधि का उपयोग करना संभव है (स्ट्रिंग डेटा, स्ट्रिंग माइम टाइप, स्ट्रिंग एन्कोडिंग)

HTML डेटा की अज्ञात एन्कोडिंग के साथ समस्या को कैसे संभालना है ?!

वहाँ encodings की एक सूची है ?!

मैं अपने कॉलेज से जानता हूं कि मेरे मामले में html डीबी से आता है और लैटिन -1 के साथ एन्कोडेड है। मैं ISO-8859-1 / iso-8859-1 को लैटिन -1 में एन्कोडिंग पैरामीटर सेट करने की कोशिश करता हूं, लेकिन अभी भी ä, ö, ü जैसे विशेष संकेतों को प्रदर्शित करने में समस्या है।

मैं किसी भी सलाह के लिए बहुत आभारी रहूंगा।

जवाबों:


206
myWebView.loadData(myHtmlString, "text/html; charset=UTF-8", null);

यह त्रुटिपूर्ण रूप से काम करता है, विशेष रूप से एंड्रॉइड 4.0 पर, जो HTML के अंदर वर्ण एन्कोडिंग को स्पष्ट रूप से अनदेखा करता है ।

2.3 और 4.0.3 पर परीक्षण किया गया।

वास्तव में, मुझे इस बारे में कोई जानकारी नहीं है कि "बेस 64" के अलावा और कौन से मूल्य अंतिम पैरामीटर लेते हैं। कुछ Google उदाहरणों ने इसमें अशक्तता ला दी।


2
यदि आप यूएस-एएससीआईआई चारसेट के बाहर चरित्र रखते हैं तो यह "त्रुटिपूर्ण" काम नहीं कर सकता है।
एंड्रे नोविकोव

1
बस 4.2.2 डिवाइस पर कोशिश की गई है और एक आकर्षण की तरह काम करता है, लेकिन 2.3.6 डिवाइस पर यह सिर्फ कचरा पात्रों को दिखाता है। : एस
फ्रैंक

यह 4.1.2 में भी काम करता है (जो HTML के अंदर charset को भी नजरअंदाज करता है), और एक लैटिन 1 एन्कोडिंग के साथ! जाओ पता लगाओ।
लुइस ए। फ्लोरिट

2
@ यहां भी वही, एचटीसी वन 2.3.7 (शायद सभी जिंजरब्रेड) पर परीक्षण किया गया और एक ही कचरा मिला, मुझे एंड्री नोविकोव समाधान का उपयोग करना हैWebView.loadDataWithBaseURL()
फोर्समैजिक

अपने उत्तर और अंतर के बीच अंतर करें: myWebView.loadData (myHtmlString, "text / html", "UTF-8");
लो मोर्डा

135

WebView.loadData () ठीक से काम नहीं कर रहा है। मुझे क्या करना था:

String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
myWebView.loadData(header+myHtmlString, "text/html", "UTF-8");

मुझे लगता है कि आपके मामले में आपको UT1-8 को LT1 या ISO-8859-1 दोनों हेडर और WebView.loadData () में बदलना चाहिए।

और, एक पूर्ण उत्तर देने के लिए, यहाँ एनकोडिंग की आधिकारिक सूची है: http://www.iana.org/assignments/character-sets

मैं अपने उत्तर को अधिक समावेशी होने के लिए अद्यतन करता हूं:

WebView.loadData () का उपयोग करने के लिए गैर लैटिन 1 एनकोडिंग के साथ आपको HTML सामग्री को एनकोड करना होगा। पिछला उदाहरण एंड्रॉइड 4+ में सही ढंग से काम नहीं कर रहा था, इसलिए मैंने इसे इस प्रकार देखने के लिए संशोधित किया है:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.FROYO) {
    String base64 = Base64.encodeToString(htmlString.getBytes(), Base64.DEFAULT);
    myWebView.loadData(base64, "text/html; charset=utf-8", "base64");
} else {
    String header = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>";
    myWebView.loadData(header + htmlString, "text/html; charset=UTF-8", null);

}

लेकिन बाद में मैंने WebView.loadDataWithBaseURL () पर स्विच कर दिया और कोड बहुत साफ हो गया और Android संस्करण के आधार पर नहीं:

WebSettings settings = myWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");
myWebView.loadDataWithBaseURL(null, htmlString, "text/html", "utf-8", null);

किसी कारण से इन कार्यों का पूरी तरह से अलग कार्यान्वयन है।


1
प्रिवेट, एंड्री। मैंने आपके समाधान की कोशिश की है। दुर्भाग्य से यह मेरे लिए काम नहीं किया :(
Tima

जैसा कि मैंने वर्णन किया है क्या आपने यूटीएफ -8 की कोशिश की है? अब जब मैं आपके प्रश्न के बारे में सोचता हूं तो मेरे साथ यह होता है कि जावा में सभी तार UTF-8 में हैं, इसलिए मेरा उदाहरण अक्षुण्ण होना चाहिए।
एंड्री नोविकोव

सभी स्ट्रिंग्स UTF-8 हैं, लेकिन सर्वर से आने वाला पाठ लैटिन -1 में है। मुझे लगता है, मैंने UTF-8 और लैटिन -1 के साथ और ISO-8859-1 के साथ कोशिश की, लेकिन ü, ö, ä के बजाय अभी भी अजीब संकेत देखा। लेकिन मेरे पास एक और विचार है, मैं सही एन्कोडिंग का उपयोग करके सर्वर से बाइट स्ट्रीम को स्ट्रिंग में बदलने की कोशिश करूंगा। हो सकता है, वह मेरी मदद करेगा
Tima

4
4.0+ एन्कोडिंग में माइम टाइप "टेक्स्ट / html; चार्टसेट = यूटीएफ -8" में सेट किया जाना चाहिए, अन्यथा इसे मान्यता नहीं दी जाएगी
marwinXXII

2
अंतिम स्निपेट (लोडडैटविथबेसिउल के साथ एक) 4.2.2 और 2.3.6 उपकरणों दोनों पर बहुत अच्छा काम करता है: डी
फ्रैंक

36

जैसा कि मैं इसे समझता हूं, loadData()बस data:डेटा प्रदान करने वाला एक URL बनाता है।

पढ़ें javadocs के लिए loadData():

यदि एन्कोडिंग पैरामीटर का मान 'बेस 64' है, तो डेटा को बेस 64 के रूप में एन्कोड किया जाना चाहिए। अन्यथा, डेटा को सुरक्षित URL वर्णों की सीमा के अंदर ओकटेट्स के लिए ASCII एन्कोडिंग का उपयोग करना चाहिए और उस सीमा के बाहर ओक्टेट्स के लिए URL के मानक% xx हेक्स एन्कोडिंग का उपयोग करना चाहिए। उदाहरण के लिए, '#', '%', '\', '?' क्रमशः 23%,% 25,% 27,% 3f द्वारा प्रतिस्थापित किया जाना चाहिए।

इस पद्धति द्वारा बनाई गई 'डेटा' योजना URL डिफ़ॉल्ट US-ASCII चार्ट का उपयोग करती है। यदि आपको एक अलग चार्ट सेट करने की आवश्यकता है, तो आपको एक 'डेटा' योजना URL बनानी चाहिए जो URL के मध्य भाग में स्पष्ट रूप से एक charset पैरामीटर निर्दिष्ट करता है और इसके बजाय loadUrl (स्ट्रिंग) को कॉल करता है। ध्यान दें कि डेटा URL के मध्य भाग से प्राप्त चारसेट हमेशा HTML या XML दस्तावेज़ में निर्दिष्ट किए गए ही ओवरराइड होते हैं।

इसलिए, आपको या तो यूएस-एएससीआईआई का उपयोग करना चाहिए और स्वयं किसी विशेष वर्ण से बचना चाहिए, या बस बेस 64 का उपयोग करके सब कुछ एनकोड करना चाहिए। निम्नलिखित कार्य करना चाहिए, यह मानते हुए कि आप UTF-8 का उपयोग करते हैं (मैंने इसे लैटिन 1 के साथ परीक्षण नहीं किया है):

String data = ...;  // the html data
String base64 = android.util.Base64.encodeToString(data.getBytes("UTF-8"), android.util.Base64.DEFAULT);
webView.loadData(base64, "text/html; charset=utf-8", "base64");

यह मुझे हर जगह भटकने से पहले प्रलेखन की जांच करने के लिए याद दिलाता है!
प्रदीप

जवाब के लिए धन्यवाद! लोड हो रहा था एक वेबव्यू में प्रासंगिक html मदद में अलग लोड किया गया था, और यह केवल समय के कुछ काम किया। इसने इसे ठीक कर दिया है।
eric

20

मुझे यह समस्या है, लेकिन:

String content = "<html><head><meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" /></head><body>";
content += mydata + "</body></html>";
WebView1.loadData(content, "text/html", "UTF-8");

सभी उपकरणों में काम नहीं। और मैं कुछ तरीकों का विलय करता हूं:

String content = 
       "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>"+
       "<html><head>"+
       "<meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\" />"+
       "</head><body>";

content += myContent + "</body></html>";

WebView WebView1 = (WebView) findViewById(R.id.webView1);
WebView1.loadData(content, "text/html; charset=utf-8", "UTF-8");

यह काम करता हैं।


यह वह नहीं है जो Google सुझाता है। मेरा जवाब देखें और वीडियो बात करें ;-) stackoverflow.com/questions/3961589/…
पास्कल

7

इसका उपयोग करें: स्ट्रिंग customHtml = पाठ;

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);

15 बाद में और यह एकमात्र ऐसा काम है जो मेरे लिए काम करता है
गाय कॉथल

5
 String strWebData="html...." //**Your html string**

 WebView webDetail=(WebView) findViewById(R.id.webView1);

 WebSettings websetting = webDetail.getSettings();

 websetting.setDefaultTextEncodingName("utf-8");

 webDetail.loadData(strWebData, "text/html; charset=utf-8", null);

5

HTMLContent को वेब दृश्य में लोड करने का सबसे सुरक्षित तरीका है:

  1. Base64 एन्कोडिंग (आधिकारिक अनुशंसा) का उपयोग करें
  2. HTML सामग्री प्रकार के लिए UFT-8 निर्दिष्ट करें, अर्थात, "पाठ / html" के बजाय "टेक्स्ट / html; चारसेट = utf-8" (व्यक्तिगत सलाह)

"बेस 64 एनकोडिंग" एक आधिकारिक सिफारिश है जिसे क्रोमिनियम में नवीनतम 01/2019 बग (वेबव्यू एम 72 (72.0.3626.76 में मौजूद ) में फिर से लिखा गया है।

https://bugs.chromium.org/p/chromium/issues/detail?id=929083

क्रोमियम टीम का आधिकारिक बयान:

"अनुशंसित फ़िक्स:
हमारी टीम आपको Base64 के साथ डेटा एन्कोड करने की अनुशंसा करती है। हमने ऐसा करने के लिए उदाहरण प्रदान किए हैं:"

यह फिक्स बैकवर्ड कम्पैटिबल है (यह पहले के वेबव्यू वर्जन पर काम करता है), और यह भी फ्यूचर-प्रूफ होना चाहिए (आप कंटेंट इनकोडिंग के संबंध में फ्यूचर कम्पेटिबिलिटी प्रॉब्लम नहीं मारेंगे)। "

कोड नमूना:

webView.loadData(
    Base64.encodeToString(
        htmlContent.getBytes(StandardCharsets.UTF_8),
        Base64.DEFAULT), // encode in Base64 encoded 
    "text/html; charset=utf-8", // utf-8 html content (personal recommendation)
    "base64"); // always use Base64 encoded data: NEVER PUT "utf-8" here (using base64 or not): This is wrong! 

1

ऊपर दिए गए उत्तर मेरे मामले में काम नहीं करते हैं। आपको मेटा टैग में utf-8 निर्दिष्ट करना होगा

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    </head>
    <body>
        <!-- you content goes here -->
    </body>
</html>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.