Flutter从伺服器取得日文字元解码错误

时间:2018-07-16 19:12:47

标签: rest dart flutter cjk

我正在使用Flutter构建移动应用。

我需要从服务器中获取包含日语文本的json文件。返回的json的一部分是:

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

在邮递员或Chrome上尝试相同的请求将获得预期的结果(日语字符在输出中正确呈现)。

但是,通过以下代码段使用Dart提取数据时:

  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);

logcat中print语句的结果为

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

请注意,只有日语字符(content键的值)变成乱码,其他非日语值仍然可以正确显示。

两个注意事项是:

  1. 如果我尝试通过Text()在我的应用中显示此日语文本,则会呈现相同的乱码,因此这不是Android Studio的logcat的错误。
  2. 如果我使用Text('put some Japanese text here directly')(例如Text('睡眠')),Flutter会正确显示它,因此不是Text小部件会弄乱日语字符。

1 个答案:

答案 0 :(得分:11)

如果查看邮递员,您可能会看到服务器发送的/.html /ąęśćzmn-ż.html /testmhtml /%67%68%89(i&.html?get=34 http标头缺少Content-Type标签。这会导致Dart http客户端将主体解码为Latin-1而不是utf-8。有一个简单的解决方法:

encoding