如何在URL中编码加号(+)


75

下面的URL链接将打开一个新的Google邮件窗口。我的问题是Google用空格替换了电子邮件正文中的所有加号(+)。看起来它仅与+标志一起发生。我该如何补救?(我正在使用ASP.NET网页。)

https://mail.google.com/mail?view=cm&tf=0&to=someemail@somedomain.com&su=some subject&body =你好那里+你好那里

(在正文电子邮件中,“嗨,你好,那里”将显示为“嗨,你好,那里”)

Answers:


112

+字符在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());

结果

https://mail.google.com:443/mail?view=cm&tf=0&to=someemail%40somedomain.com&su=some+subject&body=Hi+there%2bHello+there


3
RFC明确指出+符号可以未经编码使用,而且如果必须对其进行编码,则没有理由将其转换为“空格”字符。也许您可以为我们指出一个适当的标准文档,其中提到将+符号转换为空格符号,反之亦然的含义。
Pablo Ariel 2013年

3
是的,你在说什么?我从未见过RFC或任何表示+表示空格的内容..
freedrull 2015年

1
警告:如果您使用该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标准的一部分。
尼克

@freedrull,但它确实以这种方式工作-显示了投票数
godblessstrawberry

请注意,IIS认为这种“双重编码”,并且通常会阻止以这种方式加载的URL并出现以下错误:HTTP错误404.11-找不到请求过滤模块配置为拒绝包含双重转义序列的请求。
布雷迪·莫里茨



3

始终对所有字符进行百分比编码是比较安全的,但在RFC-3986中定义为“未保留”的字符除外。

未保留= ALPHA / DIGIT /“-” /“。/“ _” /“〜”

因此,对加号字符和其他特殊字符进行百分比编码。

加号的问题是因为,根据RFC-1866(HTML 2.0规范)第8.2.1段。第1小节,“表单字段名称和值被转义:用'+'替换空格字符,然后转义保留字符”)。稍后的HTML规范中也提供了对表单数据进行编码的方法,请查找有关application / x-www-form-urlencoded的相关段落。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.