Android WebView mit verstümmelten UTF-8-Zeichen.


76

Ich verwende einige Webviews in meiner Android-App, kann sie jedoch nicht in der utf-8-Codierung anzeigen.

Wenn ich dieses benutze, sehe ich meine skandinavischen Zeichen nicht:

mWebView.loadUrl("file:///android_asset/om.html")

Und wenn Sie dies versuchen, wird mir überhaupt nichts angezeigt

mWebView.loadDataWithBaseURL("file:///android_asset/om.html", null, "text/html", "utf-8",null);

Grüße


1
Obwohl dies ein Duplikat von android-webview-utf-8-ist, das die akzeptierte Lösung von 2010 nicht anzeigt, funktioniert sie nicht mit neueren Android-Versionen. Die Antworten von @ Cameron Lowell Palmer und @R Earle Harris in dieser Frage enthalten Informationen, die für neuere Android-Versionen
funktionieren

Genau, es ist ähnlich, aber kein Duplikat, und dies stellt eine stärkere allgemeine Frage und Antwort dar. Bitte stimmen Sie ab, um wieder zu öffnen.
Cameron Lowell Palmer

Elena sys Es scheint, dass Ihr Abschluss dieser Frage etwas eigennützig ist. Die Antworten hier sind höher bewertet als Ihre Antwort, gerade weil die Frage ausreichend unterschiedlich und die Antworten stärker waren.
Cameron Lowell Palmer

Dies ist eine doppelte Frage von: stackoverflow.com/questions/3312643/…
Jorgesys

@ Elenasys nicht einverstanden. Es ist ähnlich, aber ausreichend unterschiedlich.
Cameron Lowell Palmer

Antworten:


152

Sie können versuchen, die Einstellungen Ihrer Webansicht zu bearbeiten, bevor Sie die Daten laden:

WebSettings settings = mWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");

"charset=utf-8"Stellen Sie außerdem, wie im Kommentar unten angegeben, sicher, dass Sie dem loadData-Aufruf Folgendes hinzufügen :

mWebView.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8");

1
Dies funktioniert nicht wie in meiner Antwort beschrieben. Das Problem ist ein Fehler in der Methode, und die Angabe der UTF-8-Codierung bei Bedarf ist nicht alles, was Sie tun müssen.
Cameron Lowell Palmer

2
Dies funktioniert für Android 2.2, aber damit es auch mit Android 4.04 funktioniert, müssen Sie den von Cameron vorgeschlagenenloadDataWithBaseURL() Ansatz verwenden .
Sulai

43
Das funktioniert bei mir unter Android 2.2.1, 4.0.4, 4.1.2. Sie müssen dem loadData-Aufruf auch "charset = utf-8" hinzufügen. So: webview.loadData (getString (R.string.info_texto), "text / html; charset = utf-8", "utf-8");
Derzu

129

Dies scheint für immer in irgendeiner Form oder Weise gebrochen worden zu sein. Ausgabe 1733

Verwenden Sie loadDataWithBaseURL anstelle von loadData.

// Pretend this is an html document with those three characters
String scandinavianCharacters = "øæå";

// Won't render correctly
webView.loadData(scandinavianCharacters, "text/html", "UTF-8");

// Will render correctly
webView.loadDataWithBaseURL(null, scandinavianCharacters, "text/html", "UTF-8", null);

Der Teil, der wirklich nervt, ist, dass loadData () auf dem Samsung Galaxy S II (4.0.3) einwandfrei funktioniert, beim Testen auf dem Galaxy Nexus (4.0.2) jedoch die Multi-Byte-Zeichen verstümmelt sind, sofern Sie nicht loadDataWithBaseURL ( ). WebView-Dokumentation

Neueste Versionen von Android

Einige berichten , eine Änderung im Verhalten der Anrufe die loaddata erfordern mimeTypeaufzunehmen charset=utf-8.

webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", "UTF-8");

Sie können diese Formulierung auch mit verwenden WebSettings

WebView webView = (WebView) findViewById(R.id.DemoWebView);
WebSettings webSettings = webView.getSettings();
webSettings.setDefaultTextEncodingName("utf-8");  
webView.loadData(scandinavianCharacters, "text/html; charset=utf-8", null);

Es ist erstaunlich, dass Android dieses grundlegende Problem immer noch nicht gelöst hat.


1
Danke dafür. Hat bei mir ganz gut funktioniert.
Sean Glover

1
Danke, funktioniert gut für mich auf meinem Galaxy S3. Es ist allerdings nervig.
nspo

Ich kann das invertierte Ausrufezeichen (¡, & # 161;, & iexcl;) mit keiner dieser Methoden anzeigen. Weiß jemand, wie man das umgeht?
Cassio Landim

2
Ich benutze Android 4.4.4 und habe bei mir nicht funktioniert. text/html; charset=utf-8hat funktioniert.
Azad

1
Es wäre großartig, eine endgültige Antwort darauf zu haben, auf welcher API-Ebene sich dies geändert hat. Beim Testen auf Samsung Galaxy S3 (API 16) führt "text / html; charset = utf-8" zu verstümmeltem Text, während "text / html" funktioniert. Bei Moto G (API 23) ist es umgekehrt. Ich habe auf if (Build.VERSION.SDK_INT> 16) zurückgegriffen, um die Codierungszeichenfolge auszuwählen, aber ich befürchte, dass dies immer noch nicht für alle Geräte funktioniert. API-Ebenen
QuantumTiger

27

Derzu's Bit ist oben sehr hilfreich:

webview.loadData(getString(R.string.info_texto), "text/html; charset=utf-8", "utf-8"); 

Ich hatte utf-8 auf Adroid 2.x und verstümmelte ansi auf 4.x, bis ich das einfügte

 charset=utf-8

im Aufruf von wv.loadUrlWhatever (). Hervorragende Liebe zum Detail, Derzu


Zusätzliche Einstellung beschrieben stackoverflow.com/a/4933345/866333 von Eric Nordvik nicht einmal benötigt. Zumindest nicht für 4.1.2
John

Großartig: hat mir Zeit gespart
Dhruvil Patel

12

Es gibt zwei Möglichkeiten, wie eine von einem HTTP-Server bereitgestellte HTML-Seite die Inhaltscodierung angeben kann. Normalerweise gibt der Server die Inhaltscodierung in den HTTP-Headern an. Da diese Seite jedoch aus einer Datei geladen wird, gibt es keine HTTP-Transaktion und daher keine Header. Infolgedessen geht WebView von einer Standardcodierung von Latin-1 aus.

Sie können jedoch mithilfe des <meta>Tags eine Inhaltscodierung angeben . Erstellen Sie Ihre HTML-Datei folgendermaßen:

<!DOCTYPE HTML>
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <title>Title</title>
</head>
Your content following

Und laden Sie es dann mit in WebView mWebView.loadUrl("file:///android_asset/om.html");. Es sollte die nicht-lateinischen Zeichen wie erwartet anzeigen.


2
Diese Lösung habe ich benötigt, da ich den HTML-Inhalt per Datei lade. Danke: D
Agung Pratama

9
WebView wv = (WebView) findViewById(R.id.rowWebview);
WebSettings settings = wv.getSettings();
settings.setDefaultTextEncodingName("utf-8");                   
wv.loadData(topHtml, "text/html; charset=utf-8",null);

Eine Kombination aus beiden scheint für mich zu funktionieren. Aus irgendeinem Grund mag es null für die Codierung und den Zeichensatz im MIME-Typ: / seltsam. Dies hat Monate der Erschwerung für mich gelöst.


Ja, nur diese beiden Einstellungen von "utf-8" haben mir auch geholfen. Das metaTag hat <meta http-equiv="content-type" content="text/html; charset=UTF-8">nur geholfen, als ich es verwendet habe loadUrl, wurde aber bei der Verwendung ignoriert loadData(getestet auf API 16 + 21).
Dirk

2

Sie müssen Ihre ersten beiden Argumente austauschen. Siehe diesen Thread: Android WebView UTF-8 wird nicht angezeigt

Ihr Code sollte also folgendermaßen aussehen:

mWebView.loadDataWithBaseURL(null, "file:///android_asset/om.html", "text/html", "utf-8",null);

2
Gemäß der Dokumentation lautet die richtige Reihenfolge: public void loadDataWithBaseURL (String baseUrl, String-Daten, String mimeType, String-Codierung, String historyUrl)
Cameron Lowell Palmer

Ja, die Dokumentation ist korrekt. Meine Antwort berücksichtigt das. Die Basis-URL muss null sein.
Sparky

Es war die Tatsache, dass Ihre Nutzlast eine Zeichenfolge mit file: // war, die durch mich ausgeschaltet wurde.
Cameron Lowell Palmer

1

Sie sollten drei Dinge beachten, um immer den richtigen Inhalt anzuzeigen:

  1. Verwenden von loadDataWithBaseUrl anstelle der Funktion loadData.
  2. Festlegen der richtigen Codierung in der HTML-Datei als Meta-Tag
  3. Festlegen von defaultTextEncodingName in WebSettings

Die Beispiele wurden über andere Antworten bereitgestellt, damit ich sie nicht wiederhole!


Sie haben erklärt, wie Inhalte mit utf-8 angezeigt werden, aber wie wäre es mit der Freigabe von URLs mit utf-8 wie diesem Link (ich möchte URLs in meiner App für soziale Netzwerke freigeben
Ahmad Ebrahimi

0

Ich bin mir nicht sicher, was Sie tun, bevor Sie diese Seite laden. Könnte diese Sicherheitsänderung etwas damit zu tun haben? Laden Sie eine Seite aus dem Web?

Hinweis für Beitrag 1.0. Aufgrund der Änderung im WebKit ist der Zugriff auf Asset-Dateien über "file: /// android_asset /" für die Unterressourcen eingeschränkter. Wenn Sie als baseUrl eine leere oder leere Zeichenfolge angeben, können Sie nicht auf Asset-Dateien zugreifen. Wenn die baseUrl etwas anderes als http (s) / ftp (s) / about / javascript als Schema ist, können Sie auf Asset-Dateien für Unterressourcen zugreifen.

Entnommen von hier: http://developer.android.com/reference/android/webkit/WebView.html Im Abschnitt über die Methode "loadDataWithBaseURL".

Können Sie stattdessen "loadData" für einen schnellen Test verwenden? Geben Sie "utf-8" für die Codierung und Einfügung eines skandinavischen Zeichens in den Datenparameter an. Einfacher Test zum Entfernen des Sicherheitsproblems.


0
mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.