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:
Text()
, le même charabia est rendu, donc ce n'est pas une faute de Android Logcat de Studio.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.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));