Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rest 颤振从服务器获取的日文字符解码错误_Rest_Dart_Flutter_Cjk - Fatal编程技术网

Rest 颤振从服务器获取的日文字符解码错误

Rest 颤振从服务器获取的日文字符解码错误,rest,dart,flutter,cjk,Rest,Dart,Flutter,Cjk,我正在用Flutter构建一个移动应用程序 我需要从服务器获取一个包含日语文本的json文件。返回的json的一部分是: { "id": "egsPu39L5bLhx3m21t1n", "userId": "MCetEAeZviyYn5IMYjnp", "userName": "巽 裕亮", "content": "フルマラソン完走に対して2018/05/06のふりかえりを行いました!" } 在postman或chrome上尝试相同的请求会得

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

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

{
     "id": "egsPu39L5bLhx3m21t1n",  
     "userId": "MCetEAeZviyYn5IMYjnp",  
     "userName": "巽 裕亮",  
     "content": "フルマラソン完走に対して2018/05/06のふりかえりを行いました!"
}
在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);
请注意,只有日文字符(内容键的值)会变成乱码,其他非日文值仍会正确显示

两项通告如下:

  • 如果我试图通过
    text()
    在我的应用程序中显示这个日文文本,就会出现同样的乱码,因此这不是Android Studio的logcat的错误
  • 如果我使用
    Text('在这里直接放一些日语文本')
    (例如:
    Text('睡眠')),颤振正确显示,因此不会是
    文本
    小部件弄乱日文字符

  • 如果您查看postman,您可能会发现服务器发送的
    内容类型
    http标头缺少
    编码
    标记。这会导致Dart http客户端将正文解码为拉丁语-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));
    
    http.Response-Response=wait-http.get('SOME-URL',头:{'Content-Type':'application/json'});
    List responseJson=json.decode(utf8.decode(response.bodyBytes));
    
    可能与感谢您提供有关编码标签的额外信息的问题相同。这非常有用!为了确保我正确理解您的意思,当我使用postman时,有9个响应标题,其中2个是
    内容编码→gzip
    内容类型→application/json
    。因此我猜
    编码
    标记没有丢失,但它的值是错误的(例如,该值应该是“utf-8”而不是“gzip”)。是这样吗?实际上,只有内容类型标题。对于
    内容类型:application/json
    Dart将采用拉丁1编码。对于
    内容类型:application/json;charset=utf-8
    Dart将使用指定的字符集从字节(response.bodyBytes)解码为字符(response.body)。解决的办法是自己解码字节,因为你知道字符集是utf-8。@RichardHeap,我可以请你看一看与颤振相关的问题吗?@RichardHeap谢谢,伙计!你救了我一天!
    http.Response response = await http.get('SOME URL',headers: {'Content-Type': 'application/json'});
    List<dynamic> responseJson = json.decode(utf8.decode(response.bodyBytes));