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:
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;
}