blob: 5974366ca6e590afd10bbbed2412b27ba46e684a [file] [log] [blame]
// Copyright (c) 2013, 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.
part of dart.convert;
/// Open-ended Encoding enum.
abstract class Encoding extends Codec<String, List<int>> {
const Encoding();
/// Returns the encoder from `String` to `List<int>`.
///
/// It may be stateful and should not be reused.
Converter<String, List<int>> get encoder;
/// Returns the decoder of `this`, converting from `List<int>` to `String`.
///
/// It may be stateful and should not be reused.
Converter<List<int>, String> get decoder;
Future<String> decodeStream(Stream<List<int>> byteStream) {
return decoder
.bind(byteStream)
.fold(StringBuffer(),
(StringBuffer buffer, String string) => buffer..write(string))
.then((StringBuffer buffer) => buffer.toString());
}
/// Name of the encoding.
///
/// If the encoding is standardized, this is the lower-case version of one of
/// the IANA official names for the character set (see
/// http://www.iana.org/assignments/character-sets/character-sets.xml)
String get name;
// All aliases (in lowercase) of supported encoding from
// http://www.iana.org/assignments/character-sets/character-sets.xml.
static final Map<String, Encoding> _nameToEncoding = <String, Encoding>{
// ISO_8859-1:1987.
"iso_8859-1:1987": latin1,
"iso-ir-100": latin1,
"iso_8859-1": latin1,
"iso-8859-1": latin1,
"latin1": latin1,
"l1": latin1,
"ibm819": latin1,
"cp819": latin1,
"csisolatin1": latin1,
// US-ASCII.
"iso-ir-6": ascii,
"ansi_x3.4-1968": ascii,
"ansi_x3.4-1986": ascii,
"iso_646.irv:1991": ascii,
"iso646-us": ascii,
"us-ascii": ascii,
"us": ascii,
"ibm367": ascii,
"cp367": ascii,
"csascii": ascii,
"ascii": ascii, // This is not in the IANA official names.
// UTF-8.
"csutf8": utf8,
"utf-8": utf8
};
/// Returns an [Encoding] for a named character set.
///
/// The names used are the IANA official names for the character set (see
/// [IANA character sets][]). The names are case insensitive.
///
/// [IANA character sets]: http://www.iana.org/assignments/character-sets/character-sets.xml
///
/// If character set is not supported `null` is returned.
static Encoding? getByName(String? name) {
if (name == null) return null;
return _nameToEncoding[name.toLowerCase()];
}
}