web-dev-qa-db-fra.com

Problème d'encodage avec le loadData de WebView

Je charge des données contenant des caractères latin-1 dans une vue Web à l'aide de

String uri = Uri.encode(html);
webview.loadData(uri, "text/html", "ISO-8859-1");

Lorsqu'ils sont affichés, les caractères latin1 sont remplacés par des caractères étranges.

Si je charge le code html directement dans un TextView (juste pour tester), les caractères latins sont correctement affichés.

Quelqu'un peut aider?

Merci

html:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

    <!-- some html -->

</html>
21
jul

Seul moyen de le faire fonctionner, comme commenté ici :

webview.loadDataWithBaseURL("fake://not/needed", html, "text/html", "utf-8", "");

Pas d'encodage d'URI, utf-8 ... bug avec loadData?

34
jul
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.

Vous devez toujours utiliser le codage UTF-8. Tous les autres caractères d'encodage sont devenus obsolètes depuis de nombreuses années déjà.

52
patryk
String start = "<html><head><meta http-equiv='Content-Type' content='text/html' charset='UTF-8' /></head><body>";
String end = "</body></html>";

webcontent.loadData(start+ YOURCONTENT + end, "text/html; charset=UTF-8", null);

Une de solution de problème.

14
Göksel Güren

J'ai display © 2011 et il affichait  ©. 

Avec le code ci-dessous, j'ai obtenu l'affichage de la valeur correcte © 2011

webViewContent.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);
7
Pritesh Shah
webView.loadDataWithBaseURL(null, html, "text/html", "utf-8", null); 
1
Mahmoud Badri

Autant que je sache: Premièrement, la méthode loadData () est utilisée pour charger du code html brut. 
Deuxièmement, il suffit de mettre le code HTML directement dans loadData (), ne l'encodez pas 

Vous voudrez peut-être essayer comme ça:

webview.loadData(uri, "text/html", "ISO-8859-1");

À votre santé!

0
Pete Houston

Informations provenant de la documentation Java sur la méthode loadData

Charge les données données dans cette vue Web à l'aide d'une URL de schéma "données". 

Notez que la même politique d'origine de JavaScript signifie que le script exécuté dans Une page chargée à l'aide de cette méthode ne pourra pas accéder au contenu Chargé à l'aide d'un modèle autre que "données", y compris "http (s)". . Pour Éviter cette restriction, utilisez loadDataWithBaseURL () avec une URL de base Appropriée. 

Le paramètre encoding spécifie si les données sont codées en base64 ou par URL . Si les données sont encodées en base64, la valeur du paramètre encoding Doit être 'base64'. Pour toutes les autres valeurs du paramètre, , Y compris null, il est supposé que les données utilisent le codage ASCII pour Octets à l'intérieur de la plage de caractères d'URL sûrs et utilisent le standard % xx codage hexadécimal des URL pour les octets situés en dehors de cette plage. Par exemple, '#', '%', '\', '?' doit ê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 de données qui spécifie explicitement un paramètre de jeu de caractères dans La partie de type média de l'URL et appeler plutôt loadUrl (String). Notez que le jeu de caractères obtenu à partir de la partie médiatype d'une URL Remplace toujours celui spécifié dans le document HTML ou XML Lui-même.

Le code suivant a fonctionné pour moi.

String base64EncodedString = null;
                        try {
                            base64EncodedString = Android.util.Base64.encodeToString((preString+mailContent.getBody()+postString).getBytes("UTF-8"), Android.util.Base64.DEFAULT);
                        } catch (UnsupportedEncodingException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        if(base64EncodedString != null)
                        {
                            wvMailContent.loadData(base64EncodedString, "text/html; charset=utf-8", "base64");  
                        }
                        else
                        {
                            wvMailContent.loadData(preString+mailContent.getBody()+postString, "text/html; charset=utf-8", "utf-8");
0
DroidBot

Moi aussi j'ai eu le problème d'obtenir un personnage étrange comme  et ici. Essayé différentes options, mais celle qui a fonctionné est ci-dessous.

String style_sheet_url = "http://something.com/assets/css/layout.css";
    String head = "<head> <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />" + 
            "<link rel=\"stylesheet\" type=\"text/css\" href=\"" + style_sheet_url + "\" /></head>";    
    String locdata = "<html xmlns=\"http://www.w3.org/1999/xhtml\">" + head + "<body>"+ data + "</body></html>";
    wv_news_text.loadData(locdata, "text/html", "utf-8");

wv_news_text est la vue Web.

0
DanKodi