diff --git a/CHANGELOG.md b/CHANGELOG.md
index 08992e9..51e21cb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,7 @@
 ## 1.1.0
 
+* Added a `DataUri` class for encoding and decoding data URIs.
+
 * The MIME spec says that media types and their parameter names are
   case-insensitive. Accordingly, `MediaType` now uses a case-insensitive map for
   its parameters and its `type` and `subtype` fields are now always lowercase.
diff --git a/lib/http_parser.dart b/lib/http_parser.dart
index 77c75c0..a03c84b 100644
--- a/lib/http_parser.dart
+++ b/lib/http_parser.dart
@@ -6,6 +6,7 @@
 
 export 'src/authentication_challenge.dart';
 export 'src/case_insensitive_map.dart';
+export 'src/data_uri.dart';
 export 'src/http_date.dart';
 export 'src/media_type.dart';
 export 'src/web_socket.dart';
diff --git a/lib/src/data_uri.dart b/lib/src/data_uri.dart
new file mode 100644
index 0000000..b8cdee9
--- /dev/null
+++ b/lib/src/data_uri.dart
@@ -0,0 +1,328 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:convert/convert.dart';
+import 'package:crypto/crypto.dart';
+import 'package:string_scanner/string_scanner.dart';
+
+import 'media_type.dart';
+import 'scan.dart';
+import 'utils.dart';
+
+/// Like [whitespace] from scan.dart, except that it matches URI-encoded
+/// whitespace rather than literal characters.
+final _whitespace = new RegExp(r'(?:(?:%0D%0A)?(?:%20|%09)+)*');
+
+/// A converter for percent encoding strings using UTF-8.
+final _utf8Percent = UTF8.fuse(percent);
+
+/// A class representing a `data:` URI that provides access to its [mediaType]
+/// and the [data] it contains.
+///
+/// Data can be encoded as a `data:` URI using [encode] or [encodeString], and
+/// decoded using [decode].
+///
+/// This implementation is based on [RFC 2397][rfc], but as that RFC is
+/// [notoriously ambiguous][ambiguities], some judgment calls have been made.
+/// This class tries to match browsers' data URI logic, to ensure that it can
+/// losslessly parse its own output, and to accept as much input as it can make
+/// sense of. A balance has been struck between these goals so that while none
+/// of them have been accomplished perfectly, all of them are close enough for
+/// practical use.
+///
+/// [rfc]: http://tools.ietf.org/html/rfc2397
+/// [ambiguities]: https://simonsapin.github.io/data-urls/
+///
+/// Some particular notes on the behavior:
+///
+/// * When encoding, all characters that are not [reserved][] in the type,
+///   subtype, parameter names, and parameter values of media types are
+///   percent-encoded using UTF-8.
+///
+/// * When decoding, the type, subtype, parameter names, and parameter values of
+///   media types are percent-decoded using UTF-8. Parameter values are allowed
+///   to contain non-token characters once decoded, but the other tokens are
+///   not.
+///
+/// * As per the spec, quoted-string parameters are not supported when decoding.
+///
+/// * Query components are included in the decoding algorithm, but fragments are
+///   not.
+///
+/// * Invalid media types and parameters will raise exceptions when decoding.
+///   This is standard for Dart parsers but contrary to browser behavior.
+///
+/// * The URL and filename-safe base64 alphabet is accepted when decoding but
+///   never emitted when encoding, since browsers don't support it.
+///
+/// [lws]: https://tools.ietf.org/html/rfc2616#section-2.2
+/// [reserved]: https://tools.ietf.org/html/rfc3986#section-2.2
+class DataUri implements Uri {
+  /// The inner URI to which all [Uri] methods are forwarded.
+  final Uri _inner;
+
+  /// The byte data contained in the data URI.
+  final List<int> data;
+
+  /// The media type declared for the data URI.
+  ///
+  /// This defaults to `text/plain;charset=US-ASCII`.
+  final MediaType mediaType;
+
+  /// The encoding declared by the `charset` parameter in [mediaType].
+  ///
+  /// If [mediaType] has no `charset` parameter, this defaults to [ASCII]. If
+  /// the `charset` parameter declares an encoding that can't be found using
+  /// [Encoding.getByName], this returns `null`.
+  Encoding get declaredEncoding {
+    var charset = mediaType.parameters["charset"];
+    return charset == null ? ASCII : Encoding.getByName(charset);
+  }
+
+  /// Creates a new data URI with the given [mediaType] and [data].
+  ///
+  /// If [base64] is `true` (the default), the data is base64-encoded;
+  /// otherwise, it's percent-encoded.
+  ///
+  /// If [encoding] is passed or [mediaType] declares a `charset` parameter,
+  /// [data] is encoded using that encoding. Otherwise, it's encoded using
+  /// [UTF8] or [ASCII] depending on whether it contains any non-ASCII
+  /// characters.
+  ///
+  /// Throws [ArgumentError] if [mediaType] and [encoding] disagree on the
+  /// encoding, and an [UnsupportedError] if [mediaType] defines an encoding
+  /// that's not supported by [Encoding.getByName].
+  factory DataUri.encodeString(String data, {bool base64: true,
+      MediaType mediaType, Encoding encoding}) {
+    if (mediaType == null) mediaType = new MediaType("text", "plain");
+
+    var charset = mediaType.parameters["charset"];
+    var bytes;
+    if (encoding != null) {
+      if (charset == null) {
+        mediaType = mediaType.change(parameters: {"charset": encoding.name});
+      } else if (Encoding.getByName(charset) != encoding) {
+        throw new ArgumentError("Media type charset '$charset' disagrees with "
+            "encoding '${encoding.name}'.");
+      }
+      bytes = encoding.encode(data);
+    } else if (charset != null) {
+      encoding = Encoding.getByName(charset);
+      if (encoding == null) {
+        throw new UnsupportedError(
+            'Unsupported media type charset "$charset".');
+      }
+      bytes = encoding.encode(data);
+    } else if (data.codeUnits.every((codeUnit) => codeUnit < 0x80)) {
+      // If the data is pure ASCII, don't bother explicitly defining a charset.
+      bytes = data.codeUnits;
+    } else {
+      // If the data isn't pure ASCII, default to UTF-8.
+      bytes = UTF8.encode(data);
+      mediaType = mediaType.change(parameters: {"charset": "utf-8"});
+    }
+
+    return new DataUri.encode(bytes, base64: base64, mediaType: mediaType);
+  }
+
+  /// Creates a new data URI with the given [mediaType] and [data].
+  ///
+  /// If [base64] is `true` (the default), the data is base64-encoded;
+  /// otherwise, it's percent-encoded.
+  factory DataUri.encode(List<int> data, {bool base64: true,
+      MediaType mediaType}) {
+    mediaType ??= new MediaType('text', 'plain');
+
+    var buffer = new StringBuffer();
+
+    // Manually stringify the media type because [section 3][rfc] requires that
+    // parameter values should have non-token characters URL-escaped rather than
+    // emitting them as quoted-strings. This also allows us to omit text/plain
+    // if possible.
+    //
+    // [rfc]: http://tools.ietf.org/html/rfc2397#section-3
+    if (mediaType.type != 'text' || mediaType.subtype != 'plain') {
+      buffer.write(_utf8Percent.encode(mediaType.type));
+      buffer.write("/");
+      buffer.write(_utf8Percent.encode(mediaType.subtype));
+    }
+
+    mediaType.parameters.forEach((attribute, value) {
+      buffer.write(";${_utf8Percent.encode(attribute)}=");
+      buffer.write(_utf8Percent.encode(value));
+    });
+
+    if (base64) {
+      buffer.write(";base64,");
+      // *Don't* use the URL-safe encoding scheme, since browsers don't actually
+      // support it.
+      buffer.write(CryptoUtils.bytesToBase64(data));
+    } else {
+      buffer.write(",");
+      buffer.write(percent.encode(data));
+    }
+
+    return new DataUri._(data, mediaType,
+        new Uri(scheme: 'data', path: buffer.toString()));
+  }
+
+  /// Decodes [uri] to make its [data] and [mediaType] available.
+  ///
+  /// [uri] may be a [Uri] or a [String].
+  ///
+  /// Throws an [ArgumentError] if [uri] is an invalid type or has a scheme
+  /// other than `data:`. Throws a [FormatException] if parsing fails.
+  factory DataUri.decode(uri) {
+    if (uri is String) {
+      uri = Uri.parse(uri);
+    } else if (uri is! Uri) {
+      throw new ArgumentError.value(uri, "uri", "Must be a String or a Uri.");
+    }
+
+    if (uri.scheme != 'data') {
+      throw new ArgumentError.value(uri, "uri", "Can only decode a data: URI.");
+    }
+
+    return wrapFormatException("data URI", uri.toString(), () {
+      // Remove the fragment, as per https://simonsapin.github.io/data-urls/.
+      // TODO(nweiz): Use Uri.removeFragment once sdk#24593 is fixed.
+      var string = uri.toString();
+      var fragment = string.indexOf('#');
+      if (fragment != -1) string = string.substring(0, fragment);
+      var scanner = new StringScanner(string);
+      scanner.expect('data:');
+
+      // Manually scan the media type for three reasons:
+      //
+      // * Media type parameter values that aren't valid tokens are URL-encoded
+      //   rather than quoted.
+      //
+      // * The media type may be omitted without omitting the parameters.
+      //
+      // * We need to be able to stop once we reach `;base64,`, even though at
+      //   first it looks like a parameter.
+      var type;
+      var subtype;
+      var implicitType = false;
+      if (scanner.scan(token)) {
+        type = _verifyToken(scanner);
+        scanner.expect('/');
+        subtype = _expectToken(scanner);
+      } else {
+        type = 'text';
+        subtype = 'plain';
+        implicitType = true;
+      }
+
+      // Scan the parameters, up through ";base64" or a comma.
+      var parameters = {};
+      var base64 = false;
+      while (scanner.scan(';')) {
+        var attribute = _expectToken(scanner);
+
+        if (attribute != 'base64') {
+          scanner.expect('=');
+        } else if (!scanner.scan('=')) {
+          base64 = true;
+          break;
+        }
+
+        // Don't use [_expectToken] because the value uses percent-encoding to
+        // escape non-token characters.
+        scanner.expect(token);
+        parameters[attribute] = _utf8Percent.decode(scanner.lastMatch[0]);
+      }
+      scanner.expect(',');
+
+      if (implicitType && parameters.isEmpty) {
+        parameters = {"charset": "US-ASCII"};
+      }
+
+      var mediaType = new MediaType(type, subtype, parameters);
+
+      var data = base64
+          ? CryptoUtils.base64StringToBytes(scanner.rest)
+          : percent.decode(scanner.rest);
+
+      return new DataUri._(data, mediaType, uri);
+    });
+  }
+
+  /// Returns the percent-decoded value of the last MIME token scanned by
+  /// [scanner].
+  ///
+  /// Throws a [FormatException] if it's not a valid token after
+  /// percent-decoding.
+  static String _verifyToken(StringScanner scanner) {
+    var value = _utf8Percent.decode(scanner.lastMatch[0]);
+    if (!value.contains(nonToken)) return value;
+    scanner.error("Invalid token.");
+    return null;
+  }
+
+  /// Scans [scanner] through a MIME token and returns its percent-decoded
+  /// value.
+  ///
+  /// Throws a [FormatException] if it's not a valid token after
+  /// percent-decoding.
+  static String _expectToken(StringScanner scanner) {
+    scanner.expect(token, name: "a token");
+    return _verifyToken(scanner);
+  }
+
+  DataUri._(this.data, this.mediaType, this._inner);
+
+  /// Returns the decoded [data] decoded using [encoding].
+  ///
+  /// [encoding] defaults to [declaredEncoding]. If the declared encoding isn't
+  /// supported by [Encoding.getByName] and [encoding] isn't passed, this throws
+  /// an [UnsupportedError].
+  String dataAsString({Encoding encoding}) {
+    encoding ??= declaredEncoding;
+    if (encoding == null) {
+      throw new UnsupportedError(
+          'Unsupported media type charset '
+          '"${mediaType.parameters["charset"]}".');
+    }
+
+    return encoding.decode(data);
+  }
+
+  String get scheme => _inner.scheme;
+  String get authority => _inner.authority;
+  String get userInfo => _inner.userInfo;
+  String get host => _inner.host;
+  int get port => _inner.port;
+  String get path => _inner.path;
+  String get query => _inner.query;
+  String get fragment => _inner.fragment;
+  Uri replace({String scheme, String userInfo, String host, int port,
+          String path, Iterable<String> pathSegments, String query,
+          Map<String, String> queryParameters, String fragment}) =>
+      _inner.replace(
+          scheme: scheme, userInfo: userInfo, host: host, port: port,
+          path: path, pathSegments: pathSegments, query: query,
+          queryParameters: queryParameters, fragment: fragment);
+  Uri removeFragment() => _inner.removeFragment();
+  List<String> get pathSegments => _inner.pathSegments;
+  Map<String, String> get queryParameters => _inner.queryParameters;
+  Uri normalizePath() => _inner.normalizePath();
+  bool get isAbsolute => _inner.isAbsolute;
+  Uri resolve(String reference) => _inner.resolve(reference);
+  Uri resolveUri(Uri reference) => _inner.resolveUri(reference);
+  bool get hasScheme => _inner.hasScheme;
+  bool get hasAuthority => _inner.hasAuthority;
+  bool get hasPort => _inner.hasPort;
+  bool get hasQuery => _inner.hasQuery;
+  bool get hasFragment => _inner.hasFragment;
+  bool get hasEmptyPath => _inner.hasEmptyPath;
+  bool get hasAbsolutePath => _inner.hasAbsolutePath;
+  String get origin => _inner.origin;
+  String toFilePath({bool windows}) => _inner.toFilePath(windows: windows);
+  String toString() => _inner.toString();
+  bool operator==(other) => _inner == other;
+  int get hashCode => _inner.hashCode;
+}
diff --git a/pubspec.yaml b/pubspec.yaml
index 0c1d578..a78597f 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,15 +1,17 @@
 name: http_parser
-version: 1.1.0-dev
+version: 1.1.0
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://github.com/dart-lang/http_parser
 description: >
   A platform-independent package for parsing and serializing HTTP formats.
 dependencies:
-  crypto: "^0.9.0"
+  convert: "^1.0.0"
   collection: ">=0.9.1 <2.0.0"
+  crypto: "^0.9.0"
   source_span: "^1.0.0"
   string_scanner: ">=0.0.0 <0.2.0"
 dev_dependencies:
+  charcode: "^1.1.0"
   test: "^0.12.0"
 environment:
-  sdk: ">=1.8.0 <2.0.0"
+  sdk: ">=1.12.0 <2.0.0"
diff --git a/test/data_uri_test.dart b/test/data_uri_test.dart
new file mode 100644
index 0000000..da97cfe
--- /dev/null
+++ b/test/data_uri_test.dart
@@ -0,0 +1,241 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:convert';
+
+import 'package:charcode/charcode.dart';
+import 'package:http_parser/http_parser.dart';
+import 'package:test/test.dart';
+
+void main() {
+  group("encode", () {
+    test("base64-encodes data by default", () {
+      var uri = new DataUri.encode([1, 2, 3, 4]);
+      expect(uri.toString(), equals("data:;base64,AQIDBA=="));
+    });
+
+    test("doesn't use URL-safe base64 encoding", () {
+      var uri = new DataUri.encode([0xFB, 0xFF]);
+      expect(uri.toString(), equals("data:;base64,+/8="));
+    });
+
+    test("percent-encodes data if base64 is disabled", () {
+      var uri = new DataUri.encode([$a, $B, $plus, $slash, 0xFF],
+          base64: false);
+      expect(uri.toString(), equals("data:,aB%2B%2F%FF"));
+    });
+
+    test("includes a media type and its parameters", () {
+      var mediaType = new MediaType('text', 'html', {
+        'foo': 'bar',
+        'baz': 'bang'
+      });
+      var uri = new DataUri.encode([], mediaType: mediaType);
+      expect(uri.toString(), equals('data:text/html;foo=bar;baz=bang;base64,'));
+    });
+
+    test("percent-encodes the media type and its parameters", () {
+      var mediaType = new MediaType('te=xt', 'ht%ml', {'f;oo': 'ba,r'});
+      var uri = new DataUri.encode([], mediaType: mediaType);
+      expect(uri.toString(),
+          equals('data:te%3Dxt/ht%25ml;f%3Boo=ba%2Cr;base64,'));
+    });
+
+    test("UTF-8 encodes non-ASCII characters", () {
+      var mediaType = new MediaType('tëxt', 'ћtml', {'føo': 'bår'});
+      var uri = new DataUri.encode([], mediaType: mediaType);
+      expect(uri.toString(),
+          equals('data:t%C3%ABxt/%D1%9Btml;f%C3%B8o=b%C3%A5r;base64,'));
+    });
+
+    test("doesn't include a text/plain media type", () {
+      var mediaType = new MediaType('text', 'plain', {'foo': 'bar'});
+      var uri = new DataUri.encode([], mediaType: mediaType);
+      expect(uri.toString(), equals('data:;foo=bar;base64,'));
+    });
+
+    group("with a string", () {
+      test("defaults to ASCII if it's sufficient", () {
+        var uri = new DataUri.encodeString('foo');
+        expect(uri.toString(), equals("data:;base64,Zm9v"));
+      });
+
+      test("defaults to UTF-8 encoding if it's needed", () {
+        var uri = new DataUri.encodeString('føo');
+        expect(uri.toString(), equals("data:;charset=utf-8;base64,ZsO4bw=="));
+      });
+
+      test("obeys a passed encoding", () {
+        var uri = new DataUri.encodeString('føo', encoding: LATIN1);
+        expect(uri.toString(), equals("data:;charset=iso-8859-1;base64,Zvhv"));
+      });
+
+      test("obeys a media type encoding", () {
+        var mediaType = new MediaType('text', 'plain',
+            {'charset': 'iso-8859-1'});
+        var uri = new DataUri.encodeString('føo', mediaType: mediaType);
+        expect(uri.toString(), equals("data:;charset=iso-8859-1;base64,Zvhv"));
+      });
+
+      test("obeys a passed encoding that matches a media type encoding", () {
+        var mediaType = new MediaType('text', 'plain',
+            {'charset': 'iso-8859-1'});
+        var uri = new DataUri.encodeString('føo',
+            encoding: LATIN1, mediaType: mediaType);
+        expect(uri.toString(), equals("data:;charset=iso-8859-1;base64,Zvhv"));
+      });
+
+      test("throws if a media type encoding is unsupported", () {
+        var mediaType = new MediaType('text', 'plain', {'charset': 'fblthp'});
+        expect(() => new DataUri.encodeString('føo', mediaType: mediaType),
+            throwsUnsupportedError);
+      });
+
+      test("throws if a passed encoding disagrees with a media type encoding",
+          () {
+        var mediaType = new MediaType('text', 'plain', {'charset': 'utf-8'});
+        expect(() {
+          new DataUri.encodeString('føo',
+              encoding: LATIN1, mediaType: mediaType);
+        }, throwsArgumentError);
+      });
+    });
+  });
+
+  group("decode", () {
+    test("decodes a base64 URI", () {
+      var uri = new DataUri.decode("data:;base64,AQIDBA==");
+      expect(uri.data, equals([1, 2, 3, 4]));
+    });
+
+    test("decodes a percent-encoded URI", () {
+      var uri = new DataUri.decode("data:,aB%2B%2F%FF");
+      expect(uri.data, equals([$a, $B, $plus, $slash, 0xFF]));
+    });
+
+    test("decodes a media type and its parameters", () {
+      var uri = new DataUri.decode("data:text/html;foo=bar;baz=bang;base64,");
+      expect(uri.data, isEmpty);
+      expect(uri.mediaType.type, equals('text'));
+      expect(uri.mediaType.subtype, equals('html'));
+      expect(uri.mediaType.parameters, equals({
+        'foo': 'bar',
+        'baz': 'bang'
+      }));
+    });
+
+    test("defaults to a text/plain media type", () {
+      var uri = new DataUri.decode("data:;base64,");
+      expect(uri.mediaType.type, equals('text'));
+      expect(uri.mediaType.subtype, equals('plain'));
+      expect(uri.mediaType.parameters, equals({'charset': 'US-ASCII'}));
+    });
+
+    test("defaults to a text/plain media type with parameters", () {
+      var uri = new DataUri.decode("data:;foo=bar;base64,");
+      expect(uri.mediaType.type, equals('text'));
+      expect(uri.mediaType.subtype, equals('plain'));
+      expect(uri.mediaType.parameters, equals({'foo': 'bar'}));
+    });
+
+    test("percent-decodes the media type and its parameters", () {
+      var uri = new DataUri.decode(
+          'data:te%78t/ht%6Dl;f%6Fo=ba%2Cr;base64,');
+      expect(uri.mediaType.type, equals('text'));
+      expect(uri.mediaType.subtype, equals('html'));
+      expect(uri.mediaType.parameters, equals({'foo': 'ba,r'}));
+    });
+
+    test("assumes the URI is UTF-8", () {
+      var uri = new DataUri.decode(
+          'data:t%C3%ABxt/%D1%9Btml;f%C3%B8o=b%C3%A5r;base64,');
+      expect(uri.mediaType.type, equals('tëxt'));
+      expect(uri.mediaType.subtype, equals('ћtml'));
+      expect(uri.mediaType.parameters, equals({'føo': 'bår'}));
+    });
+
+    test("allows a parameter named base64", () {
+      var uri = new DataUri.decode("data:;base64=no,foo");
+      expect(uri.mediaType.parameters, equals({'base64': 'no'}));
+      expect(uri.data, equals([$f, $o, $o]));
+    });
+
+    test("includes the query", () {
+      var uri = new DataUri.decode("data:,a?b=c");
+      expect(uri.data, equals([$a, $question, $b, $equal, $c]));
+    });
+
+    test("doesn't include the fragment", () {
+      var uri = new DataUri.decode("data:,a#b=c");
+      expect(uri.data, equals([$a]));
+    });
+
+    test("supports the URL-safe base64 alphabet", () {
+      var uri = new DataUri.decode("data:;base64,-_8%3D");
+      expect(uri.data, equals([0xFB, 0xFF]));
+    });
+
+    group("forbids", () {
+      test("a parameter with the wrong type", () {
+        expect(() => new DataUri.decode(12), throwsArgumentError);
+      });
+
+      test("a parameter with the wrong scheme", () {
+        expect(() => new DataUri.decode("http:;base64,"), throwsArgumentError);
+      });
+
+      test("non-token characters in invalid positions", () {
+        expect(() => new DataUri.decode("data:text//plain;base64,"),
+            throwsFormatException);
+        expect(() => new DataUri.decode("data:text/plain;;base64,"),
+            throwsFormatException);
+        expect(() => new DataUri.decode("data:text/plain;/base64,"),
+            throwsFormatException);
+        expect(() => new DataUri.decode("data:text/plain;,"),
+            throwsFormatException);
+        expect(() => new DataUri.decode("data:text/plain;base64;"),
+            throwsFormatException);
+        expect(() => new DataUri.decode("data:text/plain;foo=bar=baz;base64,"),
+            throwsFormatException);
+      });
+
+      test("encoded non-token characters in invalid positions", () {
+        expect(() => new DataUri.decode("data:te%2Cxt/plain;base64,"),
+            throwsFormatException);
+        expect(() => new DataUri.decode("data:text/pl%2Cain;base64,"),
+            throwsFormatException);
+        expect(() => new DataUri.decode("data:text/plain;f%2Coo=bar;base64,"),
+            throwsFormatException);
+      });
+    });
+  });
+
+  group("dataAsString", () {
+    test("decodes the data as ASCII by default", () {
+      var uri = new DataUri.decode("data:;base64,Zm9v");
+      expect(uri.dataAsString(), equals("foo"));
+
+      uri = new DataUri.decode("data:;base64,ZsO4bw==");
+      expect(() => uri.dataAsString(), throwsFormatException);
+    });
+
+    test("decodes the data using the declared charset", () {
+      var uri = new DataUri.decode("data:;charset=iso-8859-1;base64,ZsO4bw==");
+      expect(uri.dataAsString(), equals("fÃ¸o"));
+    });
+
+    test("throws if the charset isn't supported", () {
+      var uri = new DataUri.decode("data:;charset=fblthp;base64,ZsO4bw==");
+      expect(() => uri.dataAsString(), throwsUnsupportedError);
+    });
+
+    test("uses the given encoding in preference to the declared charset", () {
+      var uri = new DataUri.decode("data:;charset=fblthp;base64,ZsO4bw==");
+      expect(uri.dataAsString(encoding: UTF8), equals("føo"));
+
+      uri = new DataUri.decode("data:;charset=utf-8;base64,ZsO4bw==");
+      expect(uri.dataAsString(encoding: LATIN1), equals("fÃ¸o"));
+    });
+  });
+}
