How to encode the plus (+) symbol in a URL
asp.netC# 4.0GmailUrlencodeHtml Encodeasp.net Problem Overview
The URL link below will open a new Google mail window. The problem I have is that Google replaces all the plus (+) signs in the email body with blank space. It looks like it only happens with the +
sign. How can I remedy this? (I am working on a ASP.NET web page.)
https://mail.google.com/mail?view=cm&tf=0&[email protected]&su=some subject&body=Hi there+Hello there
(In the body email, "Hi there+Hello there" will show up as "Hi there Hello there")
asp.net Solutions
Solution 1 - asp.net
The +
character has a special meaning in a URL => it means whitespace -
. If you want to use the literal +
sign, you need to URL encode it to %2b
:
body=Hi+there%2bHello+there
Here's an example of how you could properly generate URLs in .NET:
var uriBuilder = new UriBuilder("https://mail.google.com/mail");
var values = HttpUtility.ParseQueryString(string.Empty);
values["view"] = "cm";
values["tf"] = "0";
values["to"] = "[email protected]";
values["su"] = "some subject";
values["body"] = "Hi there+Hello there";
uriBuilder.Query = values.ToString();
Console.WriteLine(uriBuilder.ToString());
The result
Solution 2 - asp.net
If you want a plus +
symbol in the body you have to encode it as 2B
.
For example: Try this
Solution 3 - asp.net
In order to encode +
value using JavaScript, you can use encodeURIComponent
function.
Example:
var url = "+11";
var encoded_url = encodeURIComponent(url);
console.log(encoded_url)
Solution 4 - asp.net
It's safer to always percent-encode all characters except those defined as "unreserved" in RFC-3986.
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
So, percent-encode the plus character and other special characters.
The problem that you are having with pluses is because, according to RFC-1866 (HTML 2.0 specification), paragraph 8.2.1. subparagraph 1., "The form field names and values are escaped: space characters are replaced by `+', and then reserved characters are escaped"). This way of encoding form data is also given in later HTML specifications, look for relevant paragraphs about application/x-www-form-urlencoded.
Solution 5 - asp.net
Just to add this to the list:
Uri.EscapeUriString("Hi there+Hello there") // Hi%20there+Hello%20there
Uri.EscapeDataString("Hi there+Hello there") // Hi%20there%2BHello%20there
See https://stackoverflow.com/a/34189188/98491
Usually you want to use EscapeDataString
which does it right.
Solution 6 - asp.net
Generally if you use .NET API's - new Uri("someproto:with+plus").LocalPath
or AbsolutePath
will keep plus character in URL. (Same "someproto:with+plus"
string)
but Uri.EscapeDataString("with+plus")
will escape plus character and will produce "with%2Bplus"
.
Just to be consistent I would recommend to always escape plus character to "%2B"
and use it everywhere - then no need to guess who thinks and what about your plus character.
I'm not sure why from escaped character '+'
decoding would produce space character ' '
- but apparently it's the issue with some of components.