it-swarm.com.de

Android. WebView und loadData

Die folgende Methode kann für die Einstellung einer Webansicht durch den Inhalt verwendet werden LoadData (String-Daten, String-MimeType, String-Codierung)

Wie gehe ich mit der unbekannten Kodierung von HTML-Daten um ?!

Gibt es eine Liste von Kodierungen ?!

Ich weiß aus meinem College, dass html in meinem Fall von DB stammt und mit latin-1 codiert ist .. Ich versuche, den Codierungsparameter auf latin-1 zu setzen, auf ISO-8859-1/iso-8859-1, aber trotzdem Probleme mit der Anzeige von Sonderzeichen wie ä, ö, ü haben.

Ich bin für jeden Rat dankbar.

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

Dies funktioniert einwandfrei, insbesondere auf Android 4.0, bei dem die Zeichencodierung inside HTML ignoriert wird.

Getestet am 2.3 und 4.0.3.

Tatsächlich habe ich keine Ahnung, welche anderen Werte außer "base64" der letzte Parameter verwendet. Einige Google-Beispiele setzen dort null.

201
patryk

WebView.loadData () funktioniert überhaupt nicht richtig. Was ich tun musste, war:

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

Ich denke, in Ihrem Fall sollten Sie UTF-8 sowohl im Header als auch in WebView.loadData () durch latin1 oder ISO-8859-1 ersetzen.

Um eine vollständige Antwort zu geben, hier die offizielle Liste der Kodierungen: http://www.iana.org/assignments/character-sets

Ich aktualisiere meine Antwort, um inklusiver zu sein:

Um WebView.loadData () mit Nicht-latin1-Kodierungen verwenden zu können, müssen Sie HTML-Inhalte kodieren. Das vorige Beispiel funktionierte in Android 4+ nicht richtig. Daher habe ich es folgendermaßen geändert:

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

}

Aber später habe ich zu WebView.loadDataWithBaseURL () gewechselt und der Code wurde sehr sauber und nicht von der Android-Version abhängig:

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

Aus irgendeinem Grund haben diese Funktionen eine völlig andere Implementierung.

127
Andrey Novikov

Nach meinem Verständnis generiert loadData() einfach eine data:-URL mit den bereitgestellten Daten.

Lesen Sie die javadocs für loadData():

Wenn der Wert des Codierungsparameters 'base64' ist, müssen die Daten als base64 codiert werden. Andernfalls müssen die Daten die Kodierung ASCII für Oktette innerhalb des Bereichs sicherer URL-Zeichen und die standardmäßige% xx-Hex-Kodierung von URLs für Oktette außerhalb dieses Bereichs verwenden. Zum Beispiel, '#', '%', '\', '?' sollte durch% 23,% 25,% 27,% 3f ersetzt werden.

Die mit dieser Methode gebildete URL für das Datenschema verwendet den Standard-US-ASCII-Zeichensatz. Wenn Sie einen anderen Zeichensatz festlegen müssen, müssen Sie eine "Daten" -Schema-URL erstellen, die explizit einen Zeichensatzparameter im Mediatyp-Abschnitt der URL angibt und stattdessen loadUrl (String) aufruft. Beachten Sie, dass der Zeichensatz, der aus dem Mediatyp-Teil einer Daten-URL abgerufen wird, immer den im HTML- oder XML-Dokument selbst angegebenen Wert überschreibt.

Daher sollten Sie entweder US-ASCII verwenden und alle Sonderzeichen selbst einblenden oder einfach alles mit Base64 kodieren. Folgendes sollte funktionieren, vorausgesetzt, Sie verwenden UTF-8 (ich habe das nicht mit latin1 getestet):

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");
34
Ralf

Ich habe dieses Problem, aber:

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

funktioniert nicht in allen Geräten. Und ich füge einige Methoden zusammen:

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

Es klappt.

18
Aloyan Dmitry

benutze das: String customHtml = Text;

           wb.loadDataWithBaseURL(null,customHtml,"text/html", "UTF-8", null);
5
krishna
 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);
4
Yiğit

die obigen Antworten funktionieren in meinem Fall nicht. Sie müssen utf-8 im Meta-Tag angeben

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

Der sicherste Weg, htmlContent in eine Webansicht zu laden, ist:

  1. base64-Codierung verwenden (offizielle Empfehlung)
  2. geben Sie als HTML-Inhaltstyp UFT-8 an, d. h. "text/html; charset = utf-8" anstelle von "text/html" (persönliche Beratung).

Offizielle offizielle Empfehlung für die Verschlüsselung von 64 -64-Codes (bereits in Javadoc vorhanden) im latest 01/2019-Fehler in Chrominium (vorhanden in WebView M72 (72.0.3626.76)):

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

Offizielle Stellungnahme des Chromium-Teams:

"Empfohlener Fix:
Unser Team empfiehlt, Daten mit Base64 zu kodieren. Wir haben Beispiele dafür gegeben:

Dieses Update ist abwärtskompatibel (funktioniert mit früheren WebView-Versionen) und sollte auch zukunftssicher sein (zukünftige Kompatibilitätsprobleme in Bezug auf die Inhaltskodierung werden nicht auftreten). "

Codebeispiel:

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! 
0
Pascal