对一个字符串进行编码 ( urlencode ) 有好几种方法,每个语言都有好几种方式,而这些方法最大的不同,就是如何对待加号 +
和空格 。
而它们的本质区别,就是采用何种编码规范:
- 如果遵循 W3C/HTML 编码,那么,空格会转换成加号
+
。 - 如果遵循 RFC2395,那么空格则会转换成
%20
,加号+
则会转换成%2b
。
正常情况下,我们所说的对网址进行编码或对参数进行编码,说的就是遵循 RFC2395 规范。
.NET Core 和 C# 语言也提供了很多种方式来处理这种编码
HttpUtility.UrlEncode (不推荐) HttpUtility.UrlPathEncode Server.UrlEncode (不推荐,asp.net 专有) Uri.EscapeUriString Uri.EscapeDataString
对于他们之间的差别,我们先来看一个例子
// See https://aka.ms/new-console-template for more information using System.Web; String hello = "Hello World ++"; Console.WriteLine(hello); Console.WriteLine(HttpUtility.UrlEncode(hello)); Console.WriteLine(HttpUtility.UrlPathEncode(hello)); Console.WriteLine(Uri.EscapeDataString(hello)); Console.WriteLine(Uri.EscapeUriString(hello)); // asp.net 中特有的 //Console.WriteLine(Server.UrlEncode(hello));
输出结果如下
Hello World ++ Hello+World+%2b%2b Hello%20World%20++ Hello%20World%20%2B%2B Hello%20World%20++
从结果中可以看出:
HttpUtility.UrlEncode
会将空格转换为+
号,而将+
编码为%2b
。HttpUtility.UrlPathEncode
会将空格转换为%20
而保持+
号不变。Uri.EscapeDataString
既会编码+
号也会编码空格。Uri.EscapeUriString
已经废弃了,作用和HttpUtility.UrlPathEncode
是一模一样。
所以,用谁不用说了吧,果断上 Uri.EscapeDataString
啊
目前尚无回复