web-dev-qa-db-fra.com

Android WebView avec des caractères UTF-8 tronqués.

J'utilise des vues Web dans mon Android, mais je ne peux pas les faire s'afficher en encodage utf-8.

Si vous utilisez celui-ci, je ne verrai pas mes caractères scandinaves:

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

Et si vous essayez celui-ci, je ne verrai rien du tout

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

Cordialement

72
elwis

Vous pouvez essayer de modifier les paramètres de votre vue Web avant de charger les données:

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

En outre, comme indiqué dans le commentaire ci-dessous, assurez-vous d'ajouter "charset=utf-8" à l'appel loadData:

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

Cela semble avoir été rompu pour toujours sous une forme ou une mode. Numéro 17

Utilisez loadDataWithBaseURL au lieu de 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);

Maintenant, ce qui est vraiment ennuyeux, c'est que sur le Samsung Galaxy S II (4.0.3), loadData () fonctionne très bien, mais en testant sur le Galaxy Nexus (4.0.2), les caractères multi-octets sont tronqués à moins que vous n'utilisiez loadDataWithBaseURL ( ). Documentation WebView

Versions récentes d'Android

Certains signalent un changement dans le comportement des appels loadData nécessitant que mimeType inclue charset=utf-8.

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

Vous pouvez également utiliser cette formulation avec 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);

Il est étonnant que Android n'a toujours pas résolu ce problème de base.

125

Le morceau de Derzu est très utile ci-dessus:

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

J'avais utf-8 sur Adroid 2.x et ansi déformé sur 4.x jusqu'à ce que je mette

 charset=utf-8

dans l'appel wv.loadUrlWwhat (). Excellente attention aux détails, Derzu

27
R Earle Harris

Il existe deux façons dont une page HTML fournie par un serveur HTTP peut spécifier l'encodage de contenu. Habituellement, le serveur spécifiera le codage de contenu dans les en-têtes HTTP, mais puisque cette page est en cours de chargement à partir d'un fichier, il n'y a pas de transaction HTTP et donc pas d'en-têtes. Par conséquent, WebView suppose un encodage par défaut de Latin-1.

Cependant, vous pouvez spécifier un encodage de contenu à l'aide de la balise <meta>. Construisez ainsi votre fichier html:

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

Ensuite, chargez-le dans WebView à l'aide de mWebView.loadUrl("file:///Android_asset/om.html");. Il devrait afficher les caractères non latins comme prévu.

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

Une combinaison des deux semble fonctionner pour moi. Pour une raison quelconque, il aime null sur l'encodage et le jeu de caractères dans le type mime:/weird. cela a résolu des mois d'aggravation pour moi.

9
user2860495

Vous devez échanger vos deux premiers arguments. Voir ce fil: Android WebView UTF-8 ne s'affiche pas

Votre code devrait donc ressembler à ceci:

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

Vous devez garder 3 choses à l'esprit pour toujours afficher le bon contenu:

  1. Utilisation de loadDataWithBaseUrl au lieu de la fonction loadData.
  2. Définition du codage correct dans le fichier html en tant que balise meta
  3. Définition de defaultTextEncodingName dans WebSettings

Les exemples ont été fournis via d'autres réponses, donc je ne répète pas!

0
Ali Hashemi

Je ne sais pas ce que vous faites avant de charger cette page. Ce changement de sécurité pourrait-il y être lié? Chargez-vous la page du Web auparavant?

Remarque pour la version 1.0. En raison de la modification du WebKit, l'accès aux fichiers de ressources via "file: /// Android_asset /" pour les sous-ressources est plus restreint. Si vous fournissez une chaîne nulle ou vide comme baseUrl, vous ne pourrez pas accéder aux fichiers de ressources. Si la baseUrl est autre chose que http (s)/ftp (s)/about/javascript comme schéma, vous pouvez accéder aux fichiers de ressources pour les sous-ressources.

Tiré d'ici: http://developer.Android.com/reference/Android/webkit/WebView.html Dans la section sur la méthode "loadDataWithBaseURL".

Pouvez-vous utiliser "loadData" à la place pour un test rapide? Spécifiez "utf-8" pour l'encodage et le collage d'un caractère scandinave dans le paramètre de données. Test simple pour supprimer le problème de sécurité.

0
Shakakai