Недопустимые арабские символы с кодировкой Utf-8 Получено с помощью http.get Flutter - PullRequest
0 голосов
/ 13 мая 2018

Привет, я пытаюсь Извлечь данные из Интернета в flutter и до тех пор, пока все символы в response.body являются английскими, все в порядке, но я получаю эти результаты с persian/arabic символами.

Ссылка на страницу, с которой я тестирую: http://mobagym.com/media/mobagym-app-info/farsi.html (Я также проверил это с другими URL-адресами, и мои 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");

Это мой лог от андроид студии:

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

1 Ответ

0 голосов
/ 13 мая 2018

Заголовок Content-Type веб-сервера Content-Type: text/html.Обратите внимание, что не включает суффикс charset.Стоит сказать Content-Type: text/html; charset=utf-8.Клиент package:http ищет эту кодировку, когда ее просят декодировать до символов.Если он отсутствует, по умолчанию используется LATIN1 (не utf-8).

Как вы уже видели, установка заголовков в запросе не помогает, поскольку ответ выполняет декодирование.К счастью, есть простое решение.Просто расшифруйте байты строки 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...