如何对 URL 中的加号 (+) 进行编码
Posted
技术标签:
【中文标题】如何对 URL 中的加号 (+) 进行编码【英文标题】:How to encode the plus (+) symbol in a URL 【发布时间】:2011-07-23 22:32:57 【问题描述】:下面的 URL 链接将打开一个新的 Google 邮件窗口。我遇到的问题是 Google 将电子邮件正文中的所有加号 (+) 替换为空格。看起来它只发生在+
符号上。我该如何补救? (我正在开发一个 ASP.NET 网页。)
https://mail.google.com/mail?view=cm&tf=0&to=someemail@somedomain.com&su=somesubject&body=你好+你好
(在正文中,“Hi there+Hello there”将显示为“Hi there Hello there”)
【问题讨论】:
【参考方案1】:+
字符在 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
【讨论】:
RFC 明确指出 + 号可以不编码使用,如果必须编码,也没有理由将其变成“空格”字符。也许您可以向我们指出一个适当的标准文档,其中提到将 + 符号转换为空格符号,反之亦然。 是的,你在说什么?我从未见过 RFC 或任何说 + 表示空格的东西...... 警告:如果你使用UriBuilder
的 Uri
属性,你会得到一个不好的结果。 uriBuilder.Uri.ToString()
在您的示例中将返回 Hi+there+Hello+there
。使用 uriBuilder.Uri.AbsoluteUri
似乎可以正常工作,***.com/a/15120429/1931573 表明这已在 .NET 4.5 中修复。就 RFC 而言,html 4 规范说 URL 查询字符串的类型为 application/x-www-form-urlencoded
,它本身将 (+) 定义为含义空间。所以它不是 RFC,而是 HTML 标准的一部分。
请注意,IIS 会考虑这种“双重编码”,并且通常会阻止以这种方式加载的 url,并出现以下错误:HTTP 错误 404.11 - 未找到请求过滤模块配置为拒绝包含双重编码的请求转义序列。
@PabloAriel 根据W3C document addressing URLs:“在查询字符串中,加号保留为空格的简写符号。因此,必须对真正的加号进行编码。此方法用于制作查询 URI 更容易在不允许空格的系统中传递。"【参考方案2】:
如果您想在正文中添加一个 +
符号,则必须将其编码为 2B
。
例如: Try this
【讨论】:
字面意思是%2B
?【参考方案3】:
除了那些在 RFC-3986 中定义为“未保留”的字符外,始终对所有字符进行百分比编码会更安全。
未保留 = ALPHA / DIGIT / "-" / "." /“_”/“~”
因此,对加号和其他特殊字符进行百分比编码。
您遇到的问题是,根据 RFC-1866(HTML 2.0 规范),第 8.2.1 段。第 1 小段,“表单字段名称和值被转义:空格字符被 `+' 替换,然后保留字符被转义”)。这种编码表单数据的方式在后面的HTML规范中也有给出,寻找application/x-www-form-urlencoded的相关段落。
【讨论】:
【参考方案4】:为了使用 javascript 编码 +
值,您可以使用 encodeURIComponent
函数。
示例:
var url = "+11";
var encoded_url = encodeURIComponent(url);
console.log(encoded_url)
【讨论】:
developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…【参考方案5】:只是将其添加到列表中:
Uri.EscapeUriString("Hi there+Hello there") // Hi%20there+Hello%20there
Uri.EscapeDataString("Hi there+Hello there") // Hi%20there%2BHello%20there
见https://***.com/a/34189188/98491
通常你想使用正确的EscapeDataString
。
【讨论】:
【参考方案6】:通常,如果您使用 .NET API - new Uri("someproto:with+plus").LocalPath
或 AbsolutePath
将在 URL 中保留加号字符。 (相同的"someproto:with+plus"
字符串)
但Uri.EscapeDataString("with+plus")
将转义加号并生成"with%2Bplus"
。
为了保持一致,我建议始终将 plus 字符转义到 "%2B"
并在任何地方使用它 - 然后无需猜测谁在想以及你的 plus 字符会怎样。
我不确定为什么从转义字符 '+'
解码会产生空格字符 ' '
- 但显然这是某些组件的问题。
【讨论】:
以上是关于如何对 URL 中的加号 (+) 进行编码的主要内容,如果未能解决你的问题,请参考以下文章