Dart 使用http.get.Flutter检索具有Utf-8字符集的无效阿拉伯字符

Dart 使用http.get.Flutter检索具有Utf-8字符集的无效阿拉伯字符,dart,flutter,Dart,Flutter,大家好,我正在尝试使用flatter,只要response.body中的所有字符都是英语,一切都很好,但我使用波斯语/阿拉伯语字符获得这些结果 链接到我正在测试的页面: (我还用其他URL测试了它,我的api也得到了同样的结果) 这是我的代码(我还尝试在文本小部件中显示结果): 这是我在android studio的日志: Performing hot reload... Reloaded 7 of 507 libraries in 1,333ms. I/flutter (23060): <

大家好,我正在尝试使用
flatter
,只要
response.body
中的所有字符都是英语,一切都很好,但我使用
波斯语/阿拉伯语
字符获得这些结果

链接到我正在测试的页面: (我还用其他URL测试了它,我的api也得到了同样的结果)

这是我的代码(我还尝试在
文本小部件中显示结果)

这是我在android studio的日志:

Performing hot reload...
Reloaded 7 of 507 libraries in 1,333ms.
I/flutter (23060): <html>
I/flutter (23060):     <head>
I/flutter (23060):         <meta charset="utf-8"/>
I/flutter (23060):     </head>
I/flutter (23060):     <body>سÙا٠ سÙا٠Ùر٠اÛپسÙÙ</body>
I/flutter (23060): </html>
正在执行热重新加载。。。
在1333ms内重新加载了507个库中的7个。
I/颤振(23060):
I/颤振(23060):
I/颤振(23060):
I/颤振(23060):
I/颤振(23060):颤振
I/颤振(23060):
这部分是错误的:

虽然这是实际的文本:

在Android手机Xperia z3 plus(Android 6.0)上测试

使用Android studio:3.1.2

使用颤振:颤振窗口v0.3.2-beta版

在文本小部件中显示文本的结果:


web服务器的
内容类型
标题是
内容类型:text/html
。请注意,它不包括
字符集
后缀。应该是
内容类型:text/html;字符集=utf-8
package:http
客户端在被要求解码为字符时查找此字符集。如果缺少,则默认为LATIN1(而不是utf-8)

正如您所看到的,在请求上设置头并没有帮助,因为解码是由响应完成的。幸运的是,有一个简单的解决方案。只要把字节解码成这样的字符串

Future<String> loadFarsi() async {
  final response =
      await http.get("http://mobagym.com/media/mobagym-app-info/farsi.html");
  String body = utf8.decode(response.bodyBytes);
  print(body);
  return body;
}
Future loadFarsi()异步{
最后答复=
等待http.get(“http://mobagym.com/media/mobagym-app-info/farsi.html");
字符串体=utf8.decode(response.bodyBytes);
印刷品(正文);
返回体;
}

为了简洁起见,您可以编写一个实用函数,如
jsonDecodeUtf8

json_util.dart

dynamic jsonDecodeUtf8(List<int> codeUnits,
        {Object reviver(Object key, Object value)}) =>
    json.decode(utf8.decode(codeUnits), reviver: reviver);

我认为这是日志面板的问题(因为我也有这个问题),试着在widget中显示这些数据,然后在resulttried中显示这些内容,除了一些字符有点不同之外(我猜它们在我的android手机中不可用):
Future<String> loadFarsi() async {
  final response =
      await http.get("http://mobagym.com/media/mobagym-app-info/farsi.html");
  String body = utf8.decode(response.bodyBytes);
  print(body);
  return body;
}
dynamic jsonDecodeUtf8(List<int> codeUnits,
        {Object reviver(Object key, Object value)}) =>
    json.decode(utf8.decode(codeUnits), reviver: reviver);
String body = jsonDecodeUtf8(response.bodyBytes);