下面的URL链接将打开一个新的Google邮件窗口。我的问题是Google用空格替换了电子邮件正文中的所有加号(+)。看起来它仅与+
标志一起发生。我该如何补救?(我正在使用ASP.NET网页。)
https://mail.google.com/mail?view=cm&tf=0&to=someemail@somedomain.com&su=some subject&body =你好那里+你好那里
(在正文电子邮件中,“嗨,你好,那里”将显示为“嗨,你好,那里”)
下面的URL链接将打开一个新的Google邮件窗口。我的问题是Google用空格替换了电子邮件正文中的所有加号(+)。看起来它仅与+
标志一起发生。我该如何补救?(我正在使用ASP.NET网页。)
https://mail.google.com/mail?view=cm&tf=0&to=someemail@somedomain.com&su=some subject&body =你好那里+你好那里
(在正文电子邮件中,“嗨,你好,那里”将显示为“嗨,你好,那里”)
Answers:
该+
字符在URL =>中具有特殊含义,表示空格-
。如果要使用文字+
符号,则需要对其进行URL编码%2b
:
body=Hi+there%2bHello+there
这是一个如何在.NET中正确生成URL的示例:
var uriBuilder = new UriBuilder("https://mail.google.com/mail");
var values = HttpUtility.ParseQueryString(string.Empty);
values["view"] = "cm";
values["tf"] = "0";
values["to"] = "someemail@somedomain.com";
values["su"] = "some subject";
values["body"] = "Hi there+Hello there";
uriBuilder.Query = values.ToString();
Console.WriteLine(uriBuilder.ToString());
结果
Uri
属性,UriBuilder
将会得到不好的结果。 uriBuilder.Uri.ToString()
在您的示例中将返回Hi+there+Hello+there
。使用uriBuilder.Uri.AbsoluteUri
似乎可以正常工作,stackoverflow.com / a / 15120429/1931573建议此问题已在.NET 4.5中修复。就RFC而言,HTML 4规范表示URL查询字符串是一种类型application/x-www-form-urlencoded
,其本身将(+)定义为含义空间。因此,它不是RFC,而是HTML标准的一部分。
为了+
使用JavaScript编码值,可以使用encodeURIComponent
函数。
例:
var url = "+11";
var encoded_url = encodeURIComponent(url);
console.log(encoded_url)
始终对所有字符进行百分比编码是比较安全的,但在RFC-3986中定义为“未保留”的字符除外。
未保留= ALPHA / DIGIT /“-” /“。/“ _” /“〜”
因此,对加号字符和其他特殊字符进行百分比编码。
加号的问题是因为,根据RFC-1866(HTML 2.0规范)第8.2.1段。第1小节,“表单字段名称和值被转义:用'+'替换空格字符,然后转义保留字符”)。稍后的HTML规范中也提供了对表单数据进行编码的方法,请查找有关application / x-www-form-urlencoded的相关段落。
只是将其添加到列表中:
Uri.EscapeUriString("Hi there+Hello there") // Hi%20there+Hello%20there
Uri.EscapeDataString("Hi there+Hello there") // Hi%20there%2BHello%20there
参见https://stackoverflow.com/a/34189188/98491
通常,您要使用EscapeDataString
正确的方法。