我是 Flutter 开发的新手,我正在尝试解码或翻译特殊字符。 我正在使用的示例看起来像这样在 flutter 中以普通文本形式呈现:
Example: "Déjà Vu" to "Déjà Vu"
左边是它在 UI 上的显示方式,右边是我想要看到的结果。
我尝试通过文档使用
Runes
类 --> https://api.dart.dev/stable/1.24.3/dart-core/Runes-class.html 但没有运气。
这是非工作代码:
child: Text(new Runes("Déjà Vu").string)
更新:我尝试在 API 调用中传递
'Content-type': 'application/json; charset=utf-8',
,但它似乎并没有解决这个特定问题。我将附上响应的快照(我使用新标头运行它,也没有)
这是代码:
Future<http.Response> _attemptCall(String suffix) => http.get(
'$kBaseURL$suffix',
headers: {
'Authorization': 'Bearer $_accessToken',
'Content-type': 'application/json; charset=utf-8',
},
);
Future<T> _authorizedCall<T>(
String suffix,
T Function(String) decode,
) async {
if (_accessToken == '') {
await refreshToken();
}
http.Response response = await _attemptCall(suffix);
var resBody = response.body;
print('This is the response --> $resBody');
if (response.statusCode == 401) {
await refreshToken();
response = await _attemptCall(suffix);
}
if (response.statusCode == 200) {
return decode(response.body);
}
return null;
}
@override
Future<Episode> getEpisodeDetails(String id) => _authorizedCall(
_episodeDetailUrl(id),
(s) => Episode.fromJson(jsonDecode(s)),
);
这种字符集修改称为 Mojibake(感谢 Randal Schwartz 指出!)
您无法将“Déjà Vu”改回“Déjà Vu”,您必须对数据编码和发送方式或解码响应的方式采取行动。
查看这些 utf-8 字符的二进制表示:
11000011 10000011 Ã --> there is no way to tell `Ã` that it should be `à`
11000010 10101001 ©
11000011 10100000 à
11000011 10101001 é
您需要使用 API 响应修复上游问题:
Content-type: application/json; charset=utf-8
API 正在向您发送回字节流,并且应该是 utf8 以避免这种输出。
或者解码字节流的方式,你也可以改变:
return decode(response.body)
至
return decode(utf8.decode(response.bodyBytes));
来自 Flutter 的请求调用如下所示:
final response = await http.get(url, headers: {
'Content-Type': 'application/json; charset=utf-8',
'Accept': 'application/json',
'Authorization': 'Bearer ${globals.postillaToken}',
}).timeout(Duration(seconds: 5));
return Map<String, dynamic> data = json.decode(response.body);
API 本身如下所示:
return Response({
'status': True,
'message': 'Get all UserDayOff from user',
'data': serializer.data
}, status=status.HTTP_200_OK, content_type='application/json; charset=utf-8')
定义了双方的编码解决了我的问题。