78 votes

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

J'utilise quelques webviews dans mon application Android, mais je ne parviens pas à les faire s'afficher en encodage utf-8.

Si j'utilise celui-ci, je ne verrai pas mes personnages scandinaves :

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

Et si j'essaie celui-ci, je n'obtiendrai rien du tout.

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

Salutations

1 votes

Bien qu'il s'agisse d'un doublon de Android-webview-utf-8-not-show la solution acceptée en 2010 ne fonctionne pas avec les nouvelles versions d'Android. Les réponses de @ Cameron Lowell Palmer et @R Earle Harris à cette question contiennent des informations qui fonctionnent pour les nouvelles versions d'Android.

0 votes

Exactement, c'est similaire, mais ce n'est pas un doublon et cela représente une question et une réponse générale plus forte. Veuillez voter pour la réouverture.

0 votes

Elena sys Il semble que votre réponse à cette question soit quelque peu intéressée. Les réponses ici sont mieux notées que votre réponse, précisément parce que la question était suffisamment différente et les réponses plus fortes.

158voto

Eric Nordvik Points 6975

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

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

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

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

1 votes

Cela ne fonctionnera pas comme décrit dans ma réponse. Le problème est un bogue dans la méthode, et spécifier l'encodage UTF-8 bien que nécessaire n'est pas tout ce que vous devez faire.

2 votes

Cela fonctionne pour Android 2.2, mais pour que cela fonctionne aussi avec Android 4.04, vous devez utiliser la fonction loadDataWithBaseURL() approche suggéré par Cameron .

43 votes

Cela fonctionne pour moi sur Android 2.2.1, 4.0.4, 4.1.2 . Vous devez également ajouter "charset=utf-8" à l'appel loadData. Comme ça : webview.loadData(getString(R.string.info_texto), "text/html ; charset=utf-8", "utf-8") ;

135voto

Cela semble avoir été brisé sous une forme ou une autre depuis toujours. Numéro 1733

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

Ce qui est vraiment ennuyeux, c'est que sur le Samsung Galaxy S II (4.0.3), loadData() fonctionne parfaitement, mais que lors des tests sur le Galaxy Nexus (4.0.2), les caractères à plusieurs octets sont brouillés, sauf si vous utilisez loadDataWithBaseURL(). Documentation sur le WebView

Versions récentes d'Android

Certains signalent un changement dans le comportement des appels loadData nécessitant l'utilisation de l'outil de gestion des données. mimeType d'inclure charset=utf-8 .

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

Vous pouvez également utiliser cette formule 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 qu'Android n'ait toujours pas résolu ce problème de base.

1 votes

Merci pour cela. Ça a bien marché pour moi.

1 votes

Merci, cela fonctionne bien pour moi sur mon Galaxy S3. C'est quand même ennuyeux.

0 votes

Je ne parviens pas à afficher le point d'exclamation inversé (¡, ¡, &iexcl ;) en utilisant l'une de ces méthodes. Quelqu'un sait-il comment contourner ce problème ?

27voto

R Earle Harris Points 513

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

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

J'avais un UTF-8 sur Android 2.x et un ANSI confus sur 4.x jusqu'à ce que je mette l'option

 charset=utf-8

en el wv.loadUrlWhatever() appel. Excellente attention aux détails, Derzu

0 votes

Paramètres supplémentaires décrits stackoverflow.com/a/4933345/866333 par Eric Nordvik, même pas nécessaire. Du moins pas pour la 4.1.2

0 votes

Super : j'ai gagné du temps

12voto

Aaron D Points 151

Il existe deux façons pour une page HTML délivrée par un serveur HTTP de spécifier l'encodage du contenu. Habituellement, le serveur spécifie le codage du contenu dans les en-têtes HTTP, mais comme cette page est chargée à 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 en utilisant l'option <meta> tag. Construisez votre fichier html ainsi :

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

Et ensuite le charger dans le WebView en utilisant mWebView.loadUrl("file:///android_asset/om.html"); . Les caractères non latins devraient s'afficher comme prévu.

2 votes

Cette solution est celle dont j'avais besoin, puisque je charge le contenu html via un fichier. Merci.

9voto

user2860495 Points 11
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 charset dans le type mime :/. C'est bizarre. Cela a résolu des mois d'ennuis pour moi.

0 votes

Oui, seuls ces deux paramètres de "utf-8" m'ont aidé aussi. Le site meta étiquette <meta http-equiv="content-type" content="text/html; charset=UTF-8"> a juste aidé quand j'utilisais loadUrl mais a été ignoré lors de l'utilisation de loadData (testé sur API 16 + 21).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X