如何对 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 或任何说 + 表示空格的东西...... 警告:如果你使用 UriBuilderUri 属性,你会得到一个不好的结果。 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").LocalPathAbsolutePath 将在 URL 中保留加号字符。 (相同的"someproto:with+plus" 字符串)

Uri.EscapeDataString("with+plus") 将转义加号并生成"with%2Bplus"

为了保持一致,我建议始终将 plus 字符转义到 "%2B" 并在任何地方使用它 - 然后无需猜测谁在想以及你的 plus 字符会怎样。

我不确定为什么从转义字符 '+' 解码会产生空格字符 ' ' - 但显然这是某些组件的问题。

【讨论】:

以上是关于如何对 URL 中的加号 (+) 进行编码的主要内容,如果未能解决你的问题,请参考以下文章

URL中的空格、加号究竟应该使用何种方式编码

在js传递参数中含加号(+)的处理方式

如何对bash中的所有字符(特殊和非特殊)进行url编码[重复]

为啥 PHP 将 $_COOKIE 中的加号替换为空格?

form表单中的encType属性

Jquery的序列化方法为啥要把空格替换成加号