Do not throw on malformed UTF-8 encodings. (#1890)

diff --git a/lib/src/package_meta.dart b/lib/src/package_meta.dart
index 3258b7f..ffdfe40 100644
--- a/lib/src/package_meta.dart
+++ b/lib/src/package_meta.dart
@@ -4,6 +4,7 @@
 
 library dartdoc.package_meta;
 
+import 'dart:convert';
 import 'dart:io';
 
 import 'package:analyzer/dart/element/element.dart';
@@ -14,6 +15,7 @@
 import 'logging.dart';
 
 Map<String, PackageMeta> _packageMetaCache = {};
+Encoding utf8AllowMalformed = new Utf8Codec(allowMalformed: true);
 
 Directory get defaultSdkDir {
   Directory sdkDir = new File(Platform.resolvedExecutable).parent.parent;
@@ -212,7 +214,7 @@
   factory FileContents(File file) =>
       file == null ? null : new FileContents._(file);
 
-  String get contents => file.readAsStringSync();
+  String get contents => file.readAsStringSync(encoding: utf8AllowMalformed);
 
   bool get isMarkdown => file.path.toLowerCase().endsWith('.md');
 
diff --git a/test/package_meta_test.dart b/test/package_meta_test.dart
index 15b4d49..6112aea 100644
--- a/test/package_meta_test.dart
+++ b/test/package_meta_test.dart
@@ -7,6 +7,7 @@
 import 'dart:io';
 
 import 'package:dartdoc/src/package_meta.dart';
+import 'package:path/path.dart' as pathLib;
 import 'package:test/test.dart';
 
 void main() {
@@ -23,6 +24,14 @@
     });
   });
 
+  group('PackageMeta for the test package', () {
+    PackageMeta p = new PackageMeta.fromDir(new Directory(pathLib.join(Directory.current.path, 'testing', 'test_package')));
+
+    test('readme with corrupt UTF-8 loads without throwing', () {
+      expect(p.getReadmeContents().contents, contains('Here is some messed up UTF-8.\nÐf'));
+    });
+  });
+
   group('PackageMeta.fromDir for this package', () {
     PackageMeta p = new PackageMeta.fromDir(Directory.current);
 
diff --git a/testing/test_package/README.md b/testing/test_package/README.md
index 22d04e9..9e4d75e 100644
--- a/testing/test_package/README.md
+++ b/testing/test_package/README.md
@@ -5,6 +5,8 @@
 
 This is an amazing package.
 
+## Here is some messed up UTF-8.
+ÐfуÃzƒÂ‘‰
 
 ## Examples