Flutter从服务器解码错误中取出日文字符

Tra*_*iet 10 rest cjk dart flutter

我正在用Flutter构建一个移动应用程序.

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

{
     "id": "egsPu39L5bLhx3m21t1n",  
     "userId": "MCetEAeZviyYn5IMYjnp",  
     "userName": "? ??",  
     "content": "????????????2018/05/06?????????????"
}
Run Code Online (Sandbox Code Playgroud)

在postman或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);
Run Code Online (Sandbox Code Playgroud)

printlogcat 中的语句结果是

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

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

两个通知是:

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

Ric*_*eap 25

如果您查看邮递员,您可能会看到Content-Type服务器发送的http标头缺少encoding标签.这会导致Dart http客户端将主体解码为Latin-1而不是utf-8.有一个简单的解决方法:

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

  • 实际上,只有Content-Type标头。使用`Content-Type:application / json` Dart将采用Latin-1编码。使用`Content-Type:application / json; charset = utf-8` Dart将使用指定的字符集将字节(response.bodyBytes)解码为字符(response.body)。解决方法是自己解码字节,因为您知道字符集为utf-8。 (4认同)

Hos*_*zem 9

很简单!而不是使用response.body; 你应该使用utf8.decode(response.bodyBytes)