44 votes

Android WebView UTF-8 ne s'affiche pas

J'ai une vue web et j'essaie de charger un simple texte UTF-8 dedans.

mWebView.loadData("", "text/html", "UTF-8");

Mais la WebView affiche des caractères ANSI/ASCII illisibles.

Manifestement un problème d'encodage, mais qu'est-ce que je manque pour dire à la webview d'afficher le texte Unicode?

C'est une application HelloWorld.

1 votes

Solution : Utilisez la autre méthode sur WebView -> mWebView.loadDataWithBaseURL(null, "", "text/html", "UTF-8", "about:blank");

120voto

Elenasys Points 23268

Utilisation :

mWebView.loadDataWithBaseURL(null, "將賦予他們的傳教工作標示為", "text/html", "utf-8", null);

ou en utilisant WebSettings avec setDefaultTextEncoding :

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

Pour les versions récentes d'Android, de l'API 16 à 22, il a été testé et fonctionne correctement en utilisant la méthode loadData(), nécessite que le mimeType inclue : "charset=utf-8".

WebView mWebView = (WebView) findViewById(R.id.myWebView);
WebSettings settings = mWebView.getSettings();
settings.setDefaultTextEncodingName("utf-8");                   
mWebView.loadData(myCharacters, "text/html; charset=utf-8",null);

ou

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

0 votes

Merci, avez-vous une idée pourquoi cela fonctionne, est-ce un bug? Pour moi, je peux afficher correctement l'UTF en utilisant loadData avant Honeycomb mais cela ne fonctionne pas sur Honeycomb. J'ai apporté la modification comme indiqué ci-dessus pour Honeycomb et maintenant ça s'affiche correctement.

2 votes

Salut PJL, il a été signalé comme un problème "Problème 3552 - android - WebView.loadData() ne montre pas le japonais..." code.google.com/p/android/issues/detail?id=3552, mais maintenant c'est juste un lien cassé =0

1 votes

Non seulement le Japonais, il semble que ce problème apparaisse également avec des caractères arabes.

10voto

Ce problème remonte au moins à Gingerbread

Cela semble être brisé sous une forme ou une autre depuis toujours. Problème 1733

Utilisez loadDataWithBaseURL au lieu de loadData

// Faites semblant qu'il s'agit d'un document html avec ces trois caractères
String caractères_scandinaves = "øæå";

// Ne va pas se rendre correctement
webView.loadData(caractères_scandinaves, "text/html", "UTF-8");

// Va se rendre correctement
webView.loadDataWithBaseURL(null, caractères_scandinaves, "text/html", "UTF-8", null);

Maintenant, la partie vraiment ennuyeuse 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 multioctets sont brouillés à moins d'utiliser loadDataWithBaseURL(). Documentation de WebView

Les versions récentes d'Android

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

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

Discussion

La première fois que j'ai vu cela, mon patron m'a apporté son téléphone, un ancien Nexus, alors que je développais à l'époque sur un Samsung Galaxy II et il est apparu dans notre flux d'actualités économiques sur son téléphone qui contenait beaucoup de caractères non-ASCII. Donc, non seulement c'est un problème de longue date au sein d'Android, mais cela n'est pas non plus cohérent entre les fabricants de dispositifs. C'est un domaine où il faut programmer de manière défensive.

0voto

Milad M Points 61

Vous pouvez utiliser WebSettings pour définir l'encodage par défaut. vous pouvez voir la réponse ici!

0voto

Brian Reinhold Points 425

Tant de temps s'est écoulé et toujours un problème!

Aucune de ces réponses n'a fonctionné pour moi. Peut-être avais-je une situation légèrement différente. La chaîne de texte que je chargeais provenait d'un fichier dans res/raw et était affichée dans une AlertDialog. J'avais trois symboles unicode dans le fichier. J'ai essayé toutes les méthodes ci-dessus et chacune a fonctionné et a produit des résultats identiques sur l'écran Android, mais les symboles unicode ont été affichés sous leur forme brute, par exemple \u1F4F6. Ils n'ont pas été rendus.

J'utilisais un Android Nexus 5 OS 6.

Enfin, j'ai fait ceci (en changeant le \u en 0x)

    WebView help = helpContent.findViewById(R.id.helpView);
    help.setWebViewClient(new WebViewClient()
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url)
        {
            return true;
        }
    });
    helpText = helpText.replace("0x1F4F6", new String(Character.toChars(0x1F4F6)));
    helpText = helpText.replace("0x1F4DE", new String(Character.toChars(0x1F4DE)));
    helpText = helpText.replace("0x2796", new String(Character.toChars(0x2796)));
    help.loadData(helpText, "text/html; charset=utf-8", "UTF-8");

et ça a marché. Ce n'est pas une solution mais un hack pathétique et ne fonctionnerait jamais en général. Si quelqu'un sait pourquoi j'ai besoin de le faire, je lui en serais reconnaissant!

Remarque J'ai également essayé différentes manières de représenter les symboles unicode comme, par exemple, sur w3schools et aucune n'a fonctionné.

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