Try it yourself with our free Url Encoder tool — runs entirely in your browser, no signup needed.

How to URL decode in Dart

How to URL decode in Dart

URL decoding is the process of converting a URL-encoded string back to its original form. This is a crucial step when working with URLs in Dart, as it allows you to extract and manipulate the original data. In this guide, we will explore how to URL decode in Dart, covering the basics, common edge cases, and performance tips.

Quick Example

Here is a minimal example of how to URL decode a string in Dart:

import 'dart:core';

void main() {
  final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue';
  final decodedUrl = Uri.decodeComponent(encodedUrl);
  print(decodedUrl); // Output: https://example.com/path?query=value
}

This code uses the Uri class from the dart:core library to decode the URL-encoded string.

Step-by-Step Breakdown

Let's break down the code line by line:

  • import 'dart:core';: We import the dart:core library, which provides the Uri class.
  • final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue';: We define a URL-encoded string.
  • final decodedUrl = Uri.decodeComponent(encodedUrl);: We use the decodeComponent method of the Uri class to decode the URL-encoded string. This method takes a single argument, the encoded string.
  • print(decodedUrl);: We print the decoded URL to the console.

Handling Edge Cases

Here are a few common edge cases to consider:

Empty/Null Input

If the input string is empty or null, the decodeComponent method will return an empty string or throw a NoSuchMethodError, respectively.

void main() {
  final encodedUrl = '';
  final decodedUrl = Uri.decodeComponent(encodedUrl);
  print(decodedUrl); // Output: ''

  final encodedUrl2 = null;
  try {
    final decodedUrl2 = Uri.decodeComponent(encodedUrl2);
  } catch (e) {
    print(e); // Output: NoSuchMethodError
  }
}

Invalid Input

If the input string is not a valid URL-encoded string, the decodeComponent method will throw a FormatException.

void main() {
  final encodedUrl = ' invalid%input';
  try {
    final decodedUrl = Uri.decodeComponent(encodedUrl);
  } catch (e) {
    print(e); // Output: FormatException
  }
}

Large Input

If the input string is very large, the decodeComponent method may throw an OutOfMemoryError. To avoid this, you can use a streaming approach to decode the string in chunks.

void main() {
  final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue'.repeat(1000);
  final chunks = encodedUrl.split('%');
  final decodedUrl = chunks.map(Uri.decodeComponent).join('');
  print(decodedUrl);
}

Unicode/Special Characters

The decodeComponent method can handle Unicode and special characters correctly.

void main() {
  final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3D%F0%9F%98%80';
  final decodedUrl = Uri.decodeComponent(encodedUrl);
  print(decodedUrl); // Output: https://example.com/path?query=
}

Common Mistakes

Here are a few common mistakes to avoid:

  • Using the wrong encoding: Make sure to use the correct encoding for your URL-encoded string.
void main() {
  final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue';
  final decodedUrl = Uri.decodeComponent(encodedUrl, encoding: 'latin1');
  print(decodedUrl); // Output: incorrect decoding
}

Corrected code:

void main() {
  final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue';
  final decodedUrl = Uri.decodeComponent(encodedUrl, encoding: 'utf8');
  print(decodedUrl); // Output: correct decoding
}
  • Not handling errors: Make sure to handle errors that may occur during decoding.
void main() {
  final encodedUrl = ' invalid%input';
  try {
    final decodedUrl = Uri.decodeComponent(encodedUrl);
  } catch (e) {
    print(e); // Output: FormatException
  }
}

Performance Tips

Here are a few performance tips to keep in mind:

  • Use the decodeComponent method instead of decodeUri: The decodeComponent method is faster and more efficient than decodeUri.
void main() {
  final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue';
  final decodedUrl = Uri.decodeComponent(encodedUrl);
  print(decodedUrl); // faster than decodeUri
}
  • Avoid decoding large strings: If possible, avoid decoding large strings in memory. Instead, use a streaming approach to decode the string in chunks.
void main() {
  final encodedUrl = 'https%3A%2F%2Fexample.com%2Fpath%3Fquery%3Dvalue'.repeat(1000);
  final chunks = encodedUrl.split('%');
  final decodedUrl = chunks.map(Uri.decodeComponent).join('');
  print(decodedUrl); // more efficient than decoding large string
}

FAQ

Q: What is URL decoding?

A: URL decoding is the process of converting a URL-encoded string back to its original form.

Q: Why do I need to URL decode?

A: You need to URL decode to extract and manipulate the original data from a URL-encoded string.

Q: What is the difference between decodeComponent and decodeUri?

A: decodeComponent decodes a single URL component, while decodeUri decodes an entire URI.

Q: How do I handle errors during decoding?

A: You can handle errors during decoding by using a try-catch block to catch exceptions.

Q: Can I use decodeComponent with Unicode characters?

A: Yes, decodeComponent can handle Unicode characters correctly.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp