web-dev-qa-db-fra.com

Android. WebView et loadData

Il est possible d'utiliser la méthode suivante pour définir le contenu d'une vue Web LoadData (String data, String mimeType, String encoding)

Comment gérer le problème avec l'encodage inconnu des données HTML?!

Y a-t-il une liste d'encodages?!

Je sais depuis mon collège que dans mon cas, le code HTML provient de DB et est codé avec latin-1 . J'essaie de définir le paramètre de codage sur latin-1, sur ISO-8859-1/iso-8859-1, mais avoir des problèmes avec l'affichage de signes spéciaux comme ä, ö, ü.

Je serai très reconnaissant pour tout conseil.

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

Cela fonctionne parfaitement, en particulier sur Android 4.0, qui ignore apparemment le codage de caractères inside HTML.

Testé sur 2.3 et 4.0.3.

En fait, je n'ai aucune idée de ce que les valeurs autres que "base64" prennent en dernier paramètre. Certains exemples de Google mettent null ici.

201
patryk

WebView.loadData () ne fonctionne pas du tout correctement. Ce que je devais faire était:

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

Je pense que dans votre cas, vous devriez remplacer UTF-8 par latin1 ou ISO-8859-1, à la fois dans l'en-tête et dans WebView.loadData ().

Et pour donner une réponse complète, voici la liste officielle des encodages: http://www.iana.org/assignments/character-sets

Je mets à jour ma réponse pour être plus inclusive:

Pour utiliser WebView.loadData () avec des codages non latin1, vous devez coder le contenu HTML. L'exemple précédent ne fonctionnait pas correctement sous Android 4+, je l'ai donc modifié pour ressembler à ceci:

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

}

Mais plus tard, je suis passé à WebView.loadDataWithBaseURL () et le code est devenu très propre et ne dépend plus de la version Android:

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

Pour une raison quelconque, ces fonctions ont une implémentation complètement différente.

127
Andrey Novikov

Si je comprends bien, loadData() génère simplement une URL data: avec les données fournies.

Lisez les javadocs for loadData():

Si la valeur du paramètre de codage est 'base64', les données doivent alors être codées en base64. Sinon, les données doivent utiliser le codage ASCII pour les octets situés dans la plage de caractères des adresses URL sûres et utiliser le codage standard% xx hex des URL pour les octets situés en dehors de cette plage. Par exemple, '#', '%', '\', '?' devrait être remplacé par% 23,% 25,% 27,% 3f respectivement.

L'URL du schéma 'data' formé par cette méthode utilise le jeu de caractères US-ASCII par défaut. Si vous devez définir un jeu de caractères différent, vous devez créer une URL de schéma "données" spécifiant explicitement un paramètre de jeu de caractères dans la partie type de fichier de l'URL et appelez plutôt loadUrl (String). Notez que le jeu de caractères obtenu à partir de la portion de type de média d'une URL de données remplace toujours celui spécifié dans le document HTML ou XML lui-même.

Par conséquent, vous devez soit utiliser US-ASCII et échapper vous-même à des caractères spéciaux, soit simplement tout coder à l’aide de Base64. Ce qui suit devrait fonctionner si vous utilisez UTF-8 (je n'ai pas testé cela avec latin1):

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

J'ai ce problème, mais:

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

ne fonctionne pas dans tous les appareils. Et je fusionne quelques méthodes:

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

Ça marche.

18
Aloyan Dmitry

utilisez ceci: 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

les réponses ci-dessus ne fonctionnent pas dans mon cas. Vous devez spécifier utf-8 dans la méta-tag

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

La méthode safest pour charger htmlContent dans une vue Web consiste à:

  1. utiliser le codage base64 (recommandation officielle)
  2. spécifiez UFT-8 pour le type de contenu HTML, c'est-à-dire "text/html; charset = utf-8" au lieu de "text/html" (conseils personnalisés)

Recommandation officielle d'encodage Base64 qui a été écrite à nouveau (déjà présente dans Javadoc) dans le bogue latest 01/2019 dans Chrominium (présente dans WebView M72 (72.0.3626.76)):

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

Déclaration officielle de l'équipe de Chromium:

"Correctif recommandé:
Notre équipe vous recommande de coder les données avec Base64. Nous avons fourni des exemples sur la façon de procéder:

Ce correctif est rétro-compatible (il fonctionne sur les versions antérieures de WebView) et devrait également être évolutif (vous ne rencontrerez plus de problèmes de compatibilité futurs en ce qui concerne le codage du contenu). "

Exemple de code:

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