System.Uri and encoded colon (:)
.net, c#, uri, urlencode
Solution
How about using `Uri.AbsoluteUri` instead?
var s = uri.AbsoluteUri;
// http://www.example.com/?foo=http%3A%2F%2Fwww.example.com
As per the source, `uri.ToString()` looks like it has logic to unescape certain parts which can be seen here whereas `.AbsoluteUri` has a much simpler implementation.
Uri.ToString()
As per the MSDN documentation for `System.Uri.ToString()`:
A String instance that contains the unescaped canonical representation of the Uri instance. All characters are unescaped except #, ?, and %.
However as per the example and after trying out a few more strings, it looks like the actual implementation is somwhat like 'Only `:`, `*` and `spaces` are unescaped'
%3A (:) // gets unescaped
%20 ( ) // gets unescaped
%2A (*) // gets unescaped
%2b, %26, %23, %24, %25 (+, &, #, $, %) // Remain as-is (escaped)
Other Links
- `System.Uri.AbsoluteUri`
Problem
Before .Net 4.5, it seems that System.Uri would unencode encoded slashes, but this has since been fixed. Reference: https://stackoverflow.com/a/20733619/188740 I'm encountering the same problem with colons. System.Uri still unencodes encoded colons. Example: ``` var uri = new Uri("http://www.example.com/?foo=http%3A%2F%2Fwww.example.com"); var s = uri.ToString(); //http://www.example.com/?foo=http:%2F%2Fwww.example.com ``` Notice how `%3A` gets switched back to `:` by System.Uri. Is this a bug? What's the best workaround?