C# · 12月 19, 2021

JavaScript、C# URL编码、解码总结

JavaScript部分

encodeURI() (解码为:decodeURI()):不会转义的字符:- _ . ! ~ * ‘ ( ) ;/?:@&=+$,#

encodeURIComponent() (解码为:decodeURIComponent() ):不会转义的字符: – _ . ! ~ * ‘ ( )

例如:

encodeURIComponent(“//www.jb51.cc?a=-_.!~*'();/?:@&=+$,#”)

输出:

“http%3A%2F%2Fwww.jb51.cc%3Fa%3D-_.!~*'()%3B%2F%3F%3A%40%26%3D%2B%24%2C%23”

区别:对于;/?:@&=+$,#这些字符的处理。

还有个附加的: escape() ,不过 ECMAScript v3 反对使用该方法。原因猜测是根据转义序列有关,escape()的转移序列为:对于代码单元小于等于0xFF的被替换字符,使用 %xx 格式的两位数转义序列。对于代码单元大于0xFF的被替换字符,使用 %uxxxx 格式的四位数转义序列。具体的可以研究一下ECMAScript的规范,由于本人道行太浅,就不深入研究了,哈。。 unescape() 同样不推荐使用。

C#部分:

C#部分比较混乱,不仅有很多urlencode,还有好多htmlencode。但其实在处理url时我们只关注url部分就好了,html那部分当我们处理html时才会用到,如预防xss攻击时应该就需要那些htmlencode,htmldecode了。

下面说一下url的常用方法:

Server.UrlEncode(解码:Server.UrlDecode):Server.UrlEncode使用系統预设编码做为参数调用HttpUtility.UrlEncode编码,所以如果系统全局都用UTF8格式编码,这两个方法就是一样的(至于是否使用了系统预设编码这个还有待考证,没有找到官方说法)。HttpUtility.UrlEncode(解码:HttpUtility. UrlDecode)

例如:

HttpUtility.UrlEncode(“//www.jb51.cc?a=-_.!~*'();/?:@&=+$,#”)

输出:

http%3a%2f%2fwww.jb51.cc%3fa%3d-_.!%7e*%27()%3b%2f%3f%3a%40%26%3d%2b%24%2c%23

可见:此方法会对URL地址进行编码。但是有一点要知道,就是此方法会把空格编码为+号而不是十六进制的%20,所以此方法编码参数中如果存在空格会造成错误。

Uri.EscapeUriString(解码:没找到对应的):会对中文、空格等进行转义。

例如:

Uri.EscapeUriString(“//www.jb51.cc?a=中国&123 -_.!~*'();/?:@&=+$,#”)

输出:

//www.jb51.cc?a=%E4%B8%AD%E5%9B%BD&123%20%20%20-_.!~*'();/?:@&=+$,#

可见其不会对网址进行编码。

Uri.EscapeDataString(解码: Uri.UnescapeDataString):不仅对参数,还会对网址进行编码。

例如:

Uri.EscapeDataString(“//www.jb51.cc?a=中国&123 -_.!~*'();/?:@&=+$,#”)

输出:http%3A%2F%2Fwww.jb51.cc%3Fa%3D%E4%B8%AD%E5%9B%BD%26123%20%20%20-_.%21~%2A%27%28%29%3B%2F%3F%3A%40%26%3D%2B%24%2C%23

所以,总结:

不需要编码://可用:JavaScript中用encodeURI,否则用encodeURIComponent,C#中用Uri.EscapeUriString否则用Uri.EscapeDataString