web-dev-qa-db-de.com

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

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

In diesem Fall sehe ich meine skandinavischen Charaktere nicht:

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

Und wenn ich es versuche, bekomme ich überhaupt nichts angezeigt

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

Grüße

72
elwis

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

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

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

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

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

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, aber beim Testen auf dem Galaxy Nexus (4.0.2) werden die Multibyte-Zeichen verstümmelt, es sei denn, Sie verwenden loadDataWithBaseURL ( ). WebView-Dokumentation

Neueste Versionen von Android

Einige melden eine Änderung im Verhalten der loadData-Aufrufe, die erfordern, dass mimeTypecharset=utf-8 Enthält.

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

Sie können diese Formulierung auch mit WebSettings verwenden.

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.

125

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 ansi auf 4.x verstümmelt bis ich das reinsteckte

 charset=utf-8

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

27
R Earle Harris

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

Sie können jedoch eine Inhaltskodierung mit dem Tag <meta> Angeben. Konstruieren 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

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

12
Aaron D
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 der beiden scheint für mich zu funktionieren. Aus irgendeinem Grund mag es null in der Kodierung und im Zeichensatz im MIME-Typ:/weird. Das hat Monate der Erschwerung für mich gelöst.

9
user2860495

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

Ihr Code sollte also so aussehen:

mWebView.loadDataWithBaseURL(null, "file:///Android_asset/om.html", "text/html", "utf-8",null);
2
Sparky
mwebView.loadData(URLEncoder.encode(data, "utf-8").replaceAll("\\+"," "), "text/html", "utf-8");
0
PPD

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

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

Die Beispiele wurden über andere Antworten zur Verfügung gestellt, damit ich nicht wiederhole!

0
Ali Hashemi

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

Hinweis zu Beitrag 1.0. Aufgrund der Änderung im WebKit ist der Zugriff auf Asset-Dateien über "file: /// Android_asset /" für die untergeordneten Ressourcen eingeschränkter. Wenn Sie null oder eine leere Zeichenfolge als baseUrl angeben, können Sie nicht auf Asset-Dateien zugreifen. Wenn die baseUrl ein anderes Schema als http (s)/ftp (s)/about/javascript ist, können Sie auf Asset-Dateien für Subressourcen 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" an, um ein skandinavisches Zeichen zu codieren und in den Datenparmeter einzufügen. Einfacher Test zum Entfernen des Sicherheitsproblems.

0
Shakakai