Я не смог декодировать http-ответ в UTF-8 с помощью Flutter

#ios #flutter #utf-8

#iOS #flutter #utf-8

Вопрос:

В процессе разработки приложения для iOS с помощью Flutter возникла проблема, заключающаяся в том, что HTTP-ответ не может быть декодирован с помощью UTF-8, и я хотел бы ее решить. Эмулятор Android Pixel 2 смог декодировать без каких-либо проблем, поэтому я думаю, что это специфичная для iOS проблема.

Результат является результатом запуска с использованием эмулятора tPhone 12 Pro Max. (Цель развертывания iOS = 9.0) Эта проблема заключается в том, что содержимое decoded_body_byte равно нулю.

 import 'dart:async';
import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:html/dom.dart' as dom;
import 'package:http/http.dart' as http;
import 'package:charset_converter/charset_converter.dart';
import 'package:flutter_user_agent/flutter_user_agent.dart';
// skip

String userAgent;
try {
  userAgent = await FlutterUserAgent.getPropertyAsync('userAgent');
  print("userAgent: ${userAgent}");
} on PlatformException {
  userAgent = '<error>';
}
var response = await http.Client().get(Uri.parse("http://news4vip.livedoor.biz/archives/52385788.html"), headers: {'User-Agent': userAgent});
print("Response status: ${response.statusCode}");
print("response.headers: ${response.headers['content-type']}");
String decoded_body_byte = await CharsetConverter.decode("UTF-8", response.bodyBytes);
print("decoded_body_byte: ${decoded_body_byte}"); // ここの結果がnullになってしまうことが問題になっています。
Uint8List encoded = await CharsetConverter.encode("UTF-8", "【画像】中日「かっこいい」今季のユニホーム発表www");
print("encoded.length: ${encoded.length}");
String decoded_body_byte_only_title = await CharsetConverter.decode("UTF-8", response.bodyBytes.sublist(71, 71   78));
print("decoded_body_byte_only_title: ${decoded_body_byte_only_title}");
 

Ниже приведен выходной результат приведенного выше кода.

 2021-01-23 17:09:29.964984 0900 Runner[89036:14458916] flutter: userAgent: CFNetwork/1209 Darwin/20.2.0 (iPhone iOS/14.3)
2021-01-23 17:09:30.187131 0900 Runner[89036:14458916] flutter: Response status: 200
2021-01-23 17:09:30.190547 0900 Runner[89036:14458916] flutter: response.headers: text/html; charset=utf-8
2021-01-23 17:09:30.195755 0900 Runner[89036:14458916] flutter: decoded_body_byte: null
2021-01-23 17:09:30.197368 0900 Runner[89036:14458916] flutter: encoded.length: 78
2021-01-23 17:09:30.198128 0900 Runner[89036:14458916] flutter: decoded_body_byte_only_title: 【画像】中日「かっこいい」今季のユニホーム発表www
 

Ниже приведен результат вывода $ flutter doctor.
Я был бы признателен, если бы вы могли ответить.

 % flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 1.22.5, on macOS 11.1 20C69 darwin-x64, locale ja-JP)

[!] Android toolchain - develop for Android devices (Android SDK version 29.0.2)
    ! Some Android licenses not accepted.  To resolve this, run: flutter doctor --android-licenses
[✓] Xcode - develop for iOS and macOS (Xcode 12.3)
[!] Android Studio (version 4.1)
    ✗ Flutter plugin not installed; this adds Flutter specific functionality.
    ✗ Dart plugin not installed; this adds Dart specific functionality.
[✓] VS Code (version 1.52.1)
[✓] Connected device (2 available)

! Doctor found issues in 2 categories.
 

Ответ №1:

Я могу декодировать целевую веб-страницу, используя приведенный ниже плагин вместо преобразователя кодировок. Возможно, этот http-ответ содержал недопустимый символ. https://api.flutter.dev/flutter/dart-convert/Utf8Codec/decode.html

 final decoded = Utf8Decoder(allowMalformed: true).convert(response.bodyBytes);