Флаттер http response.body плохая кодировка utf8 - PullRequest
0 голосов
/ 20 апреля 2020

Я начинаю изучать Flutter и делаю это, создав собственное приложение для чтения manga, в котором я собираю все данные с веб-сайта, которым пользуюсь чаще всего.

Моя проблема в том, что только один из mangas, который я прочитал, не может очистить данные из-за этой ошибки:

FormatException (FormatException: Bad UTF-8 encoding 0x22 (at offset 369))

Мой код скребка :

    Future<Manga> getMangaInfo(source) async{
    final response =  await _client.get(source);
    var manga;
    print(response.body);//error occurs here
    final document = parse(response.body);

    final mangaInfo = document.getElementsByClassName('tamanho-bloco-perfil');
    for(Element infos in mangaInfo){
      final infoCont = infos.getElementsByClassName('row');
      //get titulo
      Element tituloCont = infoCont[0];
      final tituloH = tituloCont.getElementsByTagName('h2');
      Element tituloCont2 = tituloH[0];
      String titulo = '['+tituloCont2.text+']';
      //print(titulo);

      //get capa

      Element capaCont = infoCont[2];
      final capaImg = capaCont.getElementsByTagName('img');
      Element capaCont2 = capaImg[0];
      final capaUrl = capaCont2.attributes['src'];

      //get caprecente
      final capsPorNumero = document.getElementsByClassName('row lancamento-linha');
      final caps = capsPorNumero[0].getElementsByTagName('a');
      Element info = caps[0];
      final numero = info.text.split(' ')[1];
      final capRecenteUrl = info.attributes['href'];

      manga = Manga(null,source,titulo,capaUrl,numero,capRecenteUrl);


    }
    return manga;

  }

response.body, который выдает ошибку

Я также пытался использовать response.bodyBytes и декодирование, но все еще не могу ее исправить

Вот ссылка на страницу: https://unionleitor.top/perfil-manga/kimetsu-no-yaiba

Мне кажется, проблема в том, что символ on в следующем метатеге на html head

<meta name="description" content="Kimetsu no Yaiba - Novo mangá sobrenatural da Shonen Jump. O mangá conta a história de Tanjiro, o filho mais velho de uma família que �">

Я не смог найти решение, может быть, я просто посмотрел не те места. Может ли кто-нибудь помочь мне решить эту проблему?
Спасибо!

1 Ответ

0 голосов
/ 20 апреля 2020

Решение 1

Предполагается, что HTTP в отсутствие определенной кодировки кодируется в ISO-8859-1 (Latin-1). И тело из его описания соответствует этому поведению. Если ответ сервера устанавливает заголовок Content-Type равным application / json; charset = utf-8 тело должно работать как положено.

Проблема, конечно, в том, что существуют серверы, которые не устанавливают charset для JSON (что допустимо), но это тоже немного серой области между двумя спецификациями:

JSON всегда должен быть UTF-8, и по этой причине говорит, что вам не нужно устанавливать кодировку, но .. HTTP всегда по умолчанию ISO-8859-1, если кодировка не установлена ​​явно. «Умный» HTTP-клиент может выбрать более точное определение JSON, чем определение HTTP, и просто сказать, что любое приложение / json по умолчанию является UTF-8 - технически нарушая стандарт HTTP. Однако в конечном итоге наиболее надежным решением для сервера является явное указание кодировки, действительной в соответствии с обоими стандартами.

  HttpClientRequest request = await HttpClient().post(_host, 4049, path) /*1*/
    ..headers.contentType = ContentType.json /*2*/
    ..write(jsonEncode(jsonData)); /*3*/
  HttpClientResponse response = await request.close(); /*4*/
  await response.transform(utf8.decoder /*5*/).forEach(print);

Решение 2 (трепетание)

используйте replaceAll для замените response.body

newString.replaceAll('�', '');

Решение 3 (php)

сначала используйте файл php для получения содержимого, затем используйте свой URL и используйте str_replace php

       $curlSession = curl_init();
        curl_setopt($curlSession, CURLOPT_URL, 'YOUR-URL');
        curl_setopt($curlSession, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($curlSession, CURLOPT_RETURNTRANSFER, true);

        $jsonData = curl_exec($curlSession);
echo $bodytag = str_replace("�", "", $jsonData);

        curl_close($curlSession);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...