JavaScript、C# URL编码、解码总结
javascript部分
encodeuri() (解码为:decodeuri()):不会转义的字符:- _ . ! ~ * ‘ ( ) ;/?:@&=+$,#
例如: encodeuri(“//www.jb51.net?a=-_.!~*'();/?:@&=+$,#”) 输出: “//www.jb51.net?a=-_.!~*'();/?:@&=+$,#”
encodeuricomponent() (解码为:decodeuricomponent() ):不会转义的字符: – _ . ! ~ * ‘ ( )
例如:
encodeuricomponent(“//www.jb51.net?a=-_.!~*'();/?:@&=+$,#”)
输出:
“http%3a%2f%2fwww.jb51.net%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.net?a=-_.!~*'();/?:@&=+$,#”)
输出:
http%3a%2f%2fwww.jb51.net%3fa%3d-_.!%7e*%27()%3b%2f%3f%3a%40%26%3d%2b%24%2c%23
可见:此方法会对url地址进行编码。但是有一点要知道,就是此方法会把空格编码为+号而不是十六进制的%20,所以此方法编码参数中如果存在空格会造成错误。
uri.escapeuristring(解码:没找到对应的):会对中文、空格等进行转义。
例如:
uri.escapeuristring(“//www.jb51.net?a=中国&123 -_.!~*'();/?:@&=+$,#”)
输出:
//www.jb51.net?a=%e4%b8%ad%e5%9b%bd&123%20%20%20-_.!~*'();/?:@&=+$,#
可见其不会对网址进行编码。
uri.escapedatastring(解码: uri.unescapedatastring):不仅对参数,还会对网址进行编码。
例如:
uri.escapedatastring(“//www.jb51.net?a=中国&123 -_.!~*'();/?:@&=+$,#”)
输出:http%3a%2f%2fwww.jb51.net%3fa%3d%e4%b8%ad%e5%9b%bd%26123%20%20%20-_.%21~%2a%2
7%28%29%3b%2f%3f%3a%40%26%3d%2b%24%2c%23
所以,总结:
不需要编码://可用:javascript中用encodeuri,否则用encodeuricomponent,c#中用uri.escapeuristring否则用uri.escapedatastring