无效的阿拉伯字符使用Utf-8字符集使用http.get Flutter进行了重复

时间:2018-05-13 17:18:21

标签: dart flutter

您好我在flutter尝试Fetch data from the internet,只要response.body中的所有字符都是英文,一切都很好,但我会使用persian/arabic字符获得这些结果。

我正在测试此页面的链接: http://mobagym.com/media/mobagym-app-info/farsi.html (我也用其他网址测试了它,我的api得到了相同的结果)

这是我的代码(我也尝试在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;
  }

我已经尝试删除标题但仍然没有运气。

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

这是我从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>

这部分错了: سÙاÙسÙاÙÙرÙاÛپس

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

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

使用Android studio: 3.1.2

使用颤振: flutter_windows_v0.3.2-beta

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

enter image description here

2 个答案:

答案 0 :(得分:16)

网络服务器的Content-Type标题为Content-Type: text/html。请注意,不包括charset后缀。它应该是Content-Type: text/html; charset=utf-8。当要求解码为字符时,package:http客户端会查找此字符集。如果缺少它,则默认为LATIN1(不是utf-8)。

正如您所见,在Request上设置标头没有帮助,因为它是执行解码的Response。幸运的是,有一个简单的解决方案。只需将字节解码为String,就像这样。

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;
}

答案 1 :(得分:0)

为了干净,您可以编写一个实用函数,如 jsonDecodeUtf8 :

json_util.dart

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

并像这样使用它:

String body = jsonDecodeUtf8(response.bodyBytes);