String decode(String text)

Source

static String decode(String text) {
  List<int> codes = new List<int>();
  List<int> bytes = new List<int>();
  int len = text.length;
  for (int i = 0; i < len; i++) {
    var codeUnit = text.codeUnitAt(i);
    if (codeUnit == _PERCENT) {
      if (i + 3 > text.length) {
        bytes.add(_PERCENT);
        continue;
      }
      int hexdecoded = _hexCharPairToByte(text, i + 1);
      if (hexdecoded > 0) {
        bytes.add(hexdecoded);
        i += 2;
      } else {
        bytes.add(_PERCENT);
      }
    } else {
      if (!bytes.isEmpty) {
        codes.addAll(
          const Utf8Decoder(allowMalformed: true)
            .convert(bytes)
            .codeUnits);
        bytes.clear();
      }
      if (codeUnit == _PLUS) {
        codes.add(_SPACE);
      } else {
        codes.add(codeUnit);
      }
    }
  }

  if (!bytes.isEmpty) {
    codes.addAll(const Utf8Decoder()
      .convert(bytes)
      .codeUnits);
    bytes.clear();
  }
  return new String.fromCharCodes(codes);
}