web-dev-qa-db-fra.com

Flutter récupéré caractère japonais du serveur décodé mal

Je crée une application mobile avec Flutter.

J'ai besoin de récupérer un fichier json sur le serveur qui comprend du texte japonais. Une partie du json retourné est:

{
     "id": "egsPu39L5bLhx3m21t1n",  
     "userId": "MCetEAeZviyYn5IMYjnp",  
     "userName": "巽 裕亮",  
     "content": "フルマラソン完走に対して2018/05/06のふりかえりを行いました!"
}

Essayer la même requête sur postman ou chrome donne le résultat attendu (les caractères japonais sont rendus correctement dans la sortie).

Mais lorsque les données sont récupérées avec Dart par l'extrait de code suivant:

  import 'Dart:convert';
  import 'package:http/http.Dart' as http;

  //irrelevant parts have been omitted    
  final response = await http.get('SOME URL',headers: {'Content-Type': 'application/json'});
  final List<dynamic> responseJson = json.decode(response.body)
  print(responseJson);

Le résultat de l'instruction print dans logcat est

{
     id: egsPu39L5bLhx3m21t1n, 
     userId: MCetEAeZviyYn5IMYjnp, 
     userName: å·½ è£äº®, 
     content: ãã«ãã©ã½ã³å®èµ°ã«å¯¾ãã¦2018/05/06ã®ãµãããããè¡ãã¾ããï¼
}

Notez que seuls les caractères japonais (valeur de la touche content) se transforment en charabia, les autres valeurs non japonaises sont toujours affichées correctement.

Deux avis sont:

  1. Si j'essaie d'afficher ce texte japonais dans mon application via Text(), le même charabia est rendu, donc ce n'est pas une faute de Android Logcat de Studio.
  2. Si j'utilise Text('put some Japanese text here directly') (ex: Text('睡眠')), Flutter l'affiche correctement, donc ce n'est pas le widget Text qui perturbe les caractères japonais.
18
Tran Triet

Si vous regardez dans Postman, vous verrez probablement que le Content-Type L'en-tête http envoyé par le serveur ne contient pas la balise encoding. Cela provoque le client Dart http pour décoder le corps en Latin-1 au lieu de utf-8. Il existe une solution simple:

http.Response response = await http.get('SOME URL',headers: {'Content-Type': 'application/json'});
List<dynamic> responseJson = json.decode(utf8.decode(response.bodyBytes));
39
Richard Heap