【问题标题】:How to encode the plus (+) symbol in a URL如何对 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”)

【问题讨论】:

    标签: asp.net c#-4.0 gmail urlencode html-encode


    【解决方案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 似乎可以正常工作,stackoverflow.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)
      【解决方案5】:

      只是将其添加到列表中:

      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

      【讨论】:

        【解决方案6】:

        通常,如果您使用 .NET API - new Uri("someproto:with+plus").LocalPathAbsolutePath 将在 URL 中保留加号字符。 (相同的"someproto:with+plus" 字符串)

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

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

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

        【讨论】:

          猜你喜欢
          • 2010-10-31
          • 1970-01-01
          • 2012-04-07
          • 1970-01-01
          • 2013-03-04
          • 2013-06-13
          • 2013-04-02
          • 2011-08-30
          • 1970-01-01
          相关资源
          最近更新 更多