convert.dart 1.64 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Hide the original utf8 [Codec] so that we can export our own implementation
// which adds additional error handling.
import 'dart:convert' hide utf8;
import 'dart:convert' as cnv show utf8, Utf8Decoder;

import 'base/common.dart';
export 'dart:convert' hide utf8, Utf8Codec, Utf8Decoder;

/// A [Codec] which reports malformed bytes when decoding.
// Created to solve https://github.com/flutter/flutter/issues/15646.
class Utf8Codec extends Encoding {
  const Utf8Codec();

  @override
  Converter<List<int>, String> get decoder => const Utf8Decoder();

  @override
  Converter<String, List<int>> get encoder => cnv.utf8.encoder;

  @override
  String get name => cnv.utf8.name;
}

Encoding get utf8 => const Utf8Codec();

class Utf8Decoder extends cnv.Utf8Decoder {
  const Utf8Decoder({this.reportErrors = true}) : super(allowMalformed: true);

  final bool reportErrors;

  @override
36
  String convert(List<int> codeUnits, [ int start = 0, int end ]) {
37 38 39 40 41 42 43 44 45 46 47 48
    final String result = super.convert(codeUnits, start, end);
    // Finding a unicode replacement character indicates that the input
    // was malformed.
    if (reportErrors && result.contains('\u{FFFD}')) {
      throwToolExit(
        'Bad UTF-8 encoding found while decoding string: $result. '
        'The Flutter team would greatly appreciate if you could file a bug or leave a'
        'comment on the issue https://github.com/flutter/flutter/issues/15646.\n'
        'The source bytes were:\n$codeUnits\n\n');
    }
    return result;
  }
49
}