问题:系统开发过程中需要用到UrlEncode进行重新编码,但是编码后解码始终对应不起来。
开始在后台执行UrlEncode()方法后,js里进行replace()后解码。
如下:
//后台
var Str = HttpUtility.UrlEncode("h t t p s://blog.csdn.net/Zhu_daye");
//执行上语句后 Str = "h+t+t+p+s%3a%2f%2fblog.csdn.net%2fZhu_daye";
//js
Str = Str.replace(/\+/g, '%20'); //Str即后台传来编码后的字符串
var JsStr = decodeURIComponent(Str); //执行后JsStr = "h+t+t+p+s://blog.csdn.net/Zhu_daye";
可以看到解码后并不是原来的字符串,解决方法如下:
//后台
var Str = HttpUtility.UrlEncode("h t t p s://blog.csdn.net/Zhu_daye");
Str = Str.Replace("+", "%20"); //将加号(+)即原字符中的空格替换替换成%20(正确编码后的字符)。
//执行后 Str = "h%20t%20t%20p%20s%3a%2f%2fblog.csdn.net%2fZhu_daye";
//js
//Str即后台传来编码后的字符串
var JsStr = decodeURIComponent(Str); //执行后JsStr = "h+t+t+p+s://blog.csdn.net/Zhu_daye";
就是将编码后空格转换的加号在后台处理了,js中仅做解码操作。
因为此方法将空格转换成“+”号没有转换成%20,所以在解码的时候要将“+”号转换成%20后进行解码。
使用HttpUtility.UrlEncode(str)方法编码后对url及参数都进行了编码,其中
冒号(:):%3a
斜杠(/):%2f
空格( ):+
问号(?):%3f
等号(=):%3d
与号(&):%26
井号(#):%23
加号(+):%2b
如果参数中有空格并没有转成 %20,而是转成了“+”号,则需要replace一下。
除此之外HttpUtility.UrlEncode方法还有3个重载分别如下
1.使用HttpUtility.UrlEncode(str, Encoding.UTF8)
多了一个参数,可以指定编码类型而已
2.使用HttpUtility.UrlEncode(byte[] bytes) 将字节数组转换为编码的 URL 字符串。
HttpUtility.UrlEncode(byteArray); 对字节数组进行编码,byteArray 为 bate[] 类型
3.使用HttpUtility.UrlEncode(byte[] bytes, int offset, int count);从数组中指定位置开始,按照指定字节数量,将字节数组转换为 URL 编码的字符串。
HttpUtility.UrlEncode(byteArray,0,6); 对字节数组进行编码,从0位置开始去5个,byteArray 为 bate[] 类型