

Flutterを使ったiOSアプリ内でHTTPレスポンス(bodybyte)をUTF-8でデコードできない問題が発生しており、指導いただければ幸いです。  
AndroidのPixel 2のエミュレータでは問題なくデコードできていたのでiOS特有の問題であると考えています。

以下のコードをiOS Deployment Target=9.0でPhone12 Pro Maxのエミュレータで実行した結果になります。  
decoded_body_byteがnullになってしまう部分が問題になります。

[code]

    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", "【画像】中日「かっこいい」今季のユニホーム発表ｗｗｗ");
    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}");
    
[/code]

以下は上コードの出力結果になります。

[code]

    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: 【画像】中日「かっこいい」今季のユニホーム発表ｗｗｗ
    
[/code]

以下flutter doctorの出力結果になります。ご回答いただければ幸いです。

[code]

    % 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.
    
[/code]


CC BY-SA 4.0
2021-01-23T08:45:54.987
73523
2021-01-24T10:29:30.543
2021-01-23T10:59:31.843
19110
16974
question
ios flutter
iOSでFlutterのUTF-8をdecodeできない問題の解決方法


みなさまコメントありがとうございます。@OOPerさまの下記の推測が正しかったようです。

> UTF-8としては不正なバイト列が含まれている

CharsetConverterではSwiftのNSStringクラスを流用しているだけのようでした。

<https://github.com/pr0gramista/charset_converter/blob/master/ios/Classes/SwiftCharsetConverterPlugin.swift#L49>

そこでデコーダーを以下のPluginに変更した所、想定通りにデコードすることができました。

<https://api.flutter.dev/flutter/dart-convert/Utf8Codec/decode.html>

[code]

    String decoded = Utf8Decoder(allowMalformed: true).convert(response.bodyBytes);
    
[/code]

※ `allowMalformed: true` がUTF8の不正文字を置換してくれるようです。

大変助かりました、ありがとうございます。


CC BY-SA 4.0
2021-01-24T09:59:29.310
73545
2021-01-24T10:29:30.543
2021-01-24T10:29:30.543
3060
16974
73523
answer