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

下面的 URL 链接将打开一个新的谷歌邮件窗口。我遇到的问题是 Google 用空格替换了电子邮件正文中所有的加号(+)。看起来只有 +标志才会出现这种情况。我该怎么补救?(我正在做一个 ASP.NET 网页。)

Https://mail.google.com/mail?view=cm&tf=0&to=someemail@somedomain.com&su=some : 你好,你好

(在正文邮件中,“ Hi there + Hello there”将显示为“ Hi there Hello there”)

181483 次浏览

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

如果你想在正文中加上 +符号,你必须把它编码为 2B

例如: 试试这个

除了在 RFC-3986中定义为“无保留”的字符之外,总是对所有字符进行百分比编码更安全。

Unreserve = ALPHA/DIGIT/“-”/“ .”/“ _”/“ ~”

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

您在使用加号时遇到的问题是,根据 RFC-1866(HTML 2.0规范) ,第8.2.1段。第一项。“表单字段名称和值被转义: 空格字符被替换为‘ +’,然后保留字符被转义”)。这种编码表单数据的方法也在后面的 HTML 规范中给出,查找关于 application/x-www-form-urlencode 的相关段落。

为了使用 JavaScript 对 +值进行编码,可以使用 encodeURIComponent函数。

例如:

var url = "+11";
var encoded_url = encodeURIComponent(url);
console.log(encoded_url)

再加一条:

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,这样做是正确的。

一般来说,如果你使用.NETAPI 的-new Uri("someproto:with+plus").LocalPath或者 AbsolutePath将会在 URL 中保留加号(相同的 "someproto:with+plus"字符串)

但是 Uri.EscapeDataString("with+plus")将逸出加字符,并将产生 "with%2Bplus"

为了保持一致性,我建议总是将 + 字符转义为 "%2B",并在任何地方使用它——这样就不需要猜测谁会这样想,你的 + 字符又是怎样的。

我不知道为什么从转义字符 '+'解码会产生空间字符 ' '-但显然这是一些组件的问题。