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