您好我在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
结果显示文本小部件中的文本:
答案 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);