嗨,我正在try flutter中的Fetch data from the internet,只要response.body中的所有字符都是英语,一切都很好,但是我得到的结果是persian/arabic个字符.

链接到我正在测试的页面: http://mobagym.com/media/mobagym-app-info/farsi.html个 (我也用其他URL测试过,我的API也得到了同样的结果)

这是我的代码(我也try 过用Text Widget表示结果):

static Future<String> loadFarsi() async{
    final response = await http.get("http://mobagym.com/media/mobagym-app-info/farsi.html",headers:{"charset":"utf-8","Accept-Charset":"utf-8"});
    print(response.body);
    return response.body;
  }

我试着go 掉了表头,但还是没有结果.

final response = await http.get("http://mobagym.com/media/mobagym-app-info/farsi.html");

这是我在Android直播间的日志(log):

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>

这部分是错误的:

虽然类似这样的内容是实际的文本: سلام سلام لرم ایپسوم

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

使用Android studio:3.1.2

使用Flutter :flutter_windows_v0.3.2-beta

显示文本小工具中的文本的结果:

enter image description here

推荐答案

web服务器的Content-Type头是Content-Type: text/html.请注意,它不包括charset后缀.应该是Content-Type: text/html; charset=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;
}

Flutter相关问答推荐

如何在SingleChildScrollView中使用GridView

如何在FiRestore中正确编写OR查询

如何在2024年使用Ffltter将用户数据保存在云FireStore中?

使用GO_ROUTER在模式内导航

查询满足AND条件的文档的FiRestore

如何画三角形的圆角?

处理 flutter/dart 模型中的空值

在 flutter 的列中使用 Expanded 时出现渲染 Flex 错误

Dart:未捕获错误:RangeError(索引):索引超出范围:索引应小于 7:7

仅在获取(读取)、Provider 时,Firestore 中的数据为空

使 Row 中的元素保持在中间的空间,如果它们太大,则将它们包裹起来

Android 模拟器在 Apple M2 芯片 EXC_BAD_ACCESS / KERN_INVALID_ADDRESS 上随机崩溃

你如何在 Flutter 中组合两个数组?

Cloud firestore:如何使用 map 对象创建和更新嵌套数组

为什么 Flutter riverpod 直接分配不起作用但方法可以

如何判断 text.contains() 是否包含多个值

Flutter 用户过滤器

为什么这个参数类型不能分配给参数类型?

Flutter Bloc Todo 示例 - 收听存储库中的单个 todo

如何在 CircleAvatar 中使用 Stack