web-dev-qa-db-fra.com

Caractères arabes non valides avec le jeu de caractères Utf-8 récupéré avec http.get Flutter

Salut, j'essaie de récupérer des données sur Internet dans flutter et tant que tous les caractères dans response.body sont en anglais tout va bien mais j'obtiens ces résultats avec persian/arabic personnages.

Lien vers la page que je teste avec: http://mobagym.com/media/mobagym-app-info/farsi.html (Je l'ai également testé avec d'autres URL et mon API a été les mêmes résultats)

Voici mon code (j'ai également essayé d'afficher le résultat dans un Text Widget):

static Future<String> loadFarsi() async{
    final response = await http.get("http://mobagym.com/media/mobagym-app-info/farsi.html",headers:{"charset":"utf-8","Accept-Charset":"utf-8"});
    print(response.body);
    return response.body;
  }

J'ai essayé de supprimer les en-têtes et toujours pas de chance.

final response = await http.get("http://mobagym.com/media/mobagym-app-info/farsi.html");

Ceci est mon journal de Android studio:

Performing hot reload...
Reloaded 7 of 507 libraries in 1,333ms.
I/flutter (23060): <html>
I/flutter (23060):     <head>
I/flutter (23060):         <meta charset="utf-8"/>
I/flutter (23060):     </head>
I/flutter (23060):     <body>سÙا٠ سÙا٠Ùر٠اÛپسÙÙ</body>
I/flutter (23060): </html>

Cette partie est erronée: سÙا٠سÙا٠ÙØ ± ٠اÛپسÙÙ

Bien que quelque chose comme ça soit le texte réel: سلام سلام لرم ایپسوم

Test sur Android Phone Xperia z3 plus (Android 6.0)

Utilisation de Android studio: 3.1.2

Utilisation de flutter: flutter_windows_v0.3.2-beta

Résultat affichant le texte dans un widget texte:

enter image description here

16
behzad.robot

Le serveur Web Content-Type l'en-tête est Content-Type: text/html. Notez que n'inclut pas de suffixe charset. Cela devrait dire Content-Type: text/html; charset=utf-8. Le package:http le client recherche ce jeu de caractères lorsqu'on lui demande de décoder en caractères. S'il est manquant, il est par défaut LATIN1 (pas utf-8).

Comme vous l'avez vu, la définition des en-têtes sur la demande n'aide pas, car c'est la réponse qui fait le décodage. Heureusement, il existe une solution simple. Décodez simplement les octets pour vous chaîne comme ceci.

Future<String> loadFarsi() async {
  final response =
      await http.get("http://mobagym.com/media/mobagym-app-info/farsi.html");
  String body = utf8.decode(response.bodyBytes);
  print(body);
  return body;
}
34
Richard Heap