标题：URL编码
定义
url编码是一种浏览器用来打包表单输入的格式。浏览器从表单中获取所有的name和其中的值 ，将它们以name/value参数编码（移去那些不能传送的字符，将数据排行等等）作为URL的一部分或者分离地发给服务器。不管哪种情况，在服务器端的表单输入格式样子象这样： 
theName=Ichabod+Crane&gender=male&status=missing& ;headless=yes
编码规则
URL编码遵循下列规则： 每对name/value由&；符分开；每对来自表单的name/value由=符分开。如果用户没有输入值给这个name，那么这个name还是出现，只是无值。任何特殊的字符（就是那些不是简单的七位ASCII，如汉字）将以百分符%用十六进制编码，当然也包括象 =,&；，和 % 这些特殊的字符。其实url编码就是一个字符ascii码的十六进制。不过稍微有些变动，需要在前面加上“%”。比如“\”，它的ascii码是92，92的十六进制是5c，所以“\”的url编码就是%5c。那么汉字的url编码呢？很简单，看例子：“胡”的ascii码是-17670，十六进制是BAFA，url编码是“%BA%FA”。  解码软件
URL编码表
backspace %08I %49v %76ó %D3tab %09J %4Aw %77&Ocirc; %D4linefeed %0AK %4Bx %78&Otilde; %D5creturn %0DL %4Cy %79&Ouml; %D6space %20M %4Dz %7A&Oslash; %D8! %21N %4E{ %7Bù %D9" %22O %4F| %7Cú　 %DA# %23P %50} %7D&Ucirc; %DB$ %24Q %51~ %7Eü %DC% %25R %52￠ %A2Y %DD& %26S %53￡ %A3T %DE' %27T %54￥ %A5&szlig; %DF( %28U %55| %A6à %E0) %29V %56§ %A7á %E1* %2AW %57&laquo; %ABa %E2+ %2BX %58&not; %AC&atilde; %E3, %2CY %59ˉ %AD&auml; %E4- %2DZ %5Ao %B0&aring; %E5. %2E[ %5B± %B1&aelig; %E6/ %2F\ %5Ca %B2&ccedil; %E70 %30] %5D, %B4è %E81 %31^ %5Eμ %B5é %E92 %32_ %5F&raquo; %BBê %EA3 %33` %60&frac14; %BC&euml; %EB4 %34a %61&frac12; %BDì %EC5 %35b %62&iquest; %BFí %ED6 %36c %63à %C0&icirc; %EE7 %37d %64á %C1&iuml; %EF8 %38e %65&Acirc; %C2e %F09 %39f %66&Atilde; %C3&ntilde; %F1: %3Ag %67&Auml; %C4ò %F2; %3Bh %68&Aring; %C5ó %F3< %3Ci %69&AElig; %C6&ocirc; %F4= %3Dj %6A&Ccedil; %C7&otilde; %F5> %3Ek %6Bè %C8&ouml; %F6%3Fl %6Cé　 %C9÷　 %F7@ %40m %6Dê %CA&oslash; %F8A %41n %6E&Euml; %CBù %F9B %42o %6Fì　 %CCú　 %FAC %43p %70í %CD&ucirc; %FBD %44q %71&Icirc; %CEü %FCE %45r %72&Iuml; %CFy %FDF %46s %73D %D0t %FEG %47t %74&Ntilde; %D1&yuml; %FFH %48u %75ò %D2​
防止sql注入
URL编码平时是用不到的，因为IE会自动将输入到地址栏的非数字字母转换为url编码。曾有人提出数据库名字里带上“#”以防止被下载，因为IE遇到#就会忽略后面的字母。破解方法很简单——用url编码%23替换掉#。现在SQL注射非常流行，所以就有人写了一些防注射的脚本。下面××SQL通用防注入asp版部分代码。
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
On Error Resume Next
for Fy_x=0 to ubound(Fy_a)
Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1）
Next
For Fy_x=0 to ubound(Fy_Cs)
If Fy_Cs(Fy_x)<>"" Then
If Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 then
Response.Write "出现错误！"
Response.End
End If
End If
Next
它的思路就是先获得提交的数据，以“&；”为分界获得并处理name/value组，然后判断value里是否含有定义的关键字，有之，则为注射。
看起来value被检查了，但是name就不同。它的name/value组值来自于Request.ServerVariables("QUERY_STRING")，这里会出现问题。Request.ServerVariables("QUERY_STRING")是得到客户端提交的字符串，这里并不会自动转换url编码，如果把name进行url编码再提交的话，就可以绕过检查了。例如：参数是ph4nt0m=lake2 and lis0，此时程序能够检测到；如果提交%50h4nt0m=lake2 and lis0（对p进行url编码），程序就会去判断%50h4nt0m的值，而%50h4nt0m会被转换为ph4nt0m，所以%50h4nt0m值为空，于是就绕过了检测。为什么既然name不解码可以绕过检查而value就不能绕过呢？因为value的值取自Request(Fy_Cs(Fy_x）），这个服务器就会解码的。要想改进程序，只要能够得到客户端提交的数据是解码后的就可以了，把得到name的语句改为For Each SubmitName In Request.QueryString就可以了。
使用举例
前言编码问题是JAVA初学者在web开发过程中经常会遇到问题，其中之一是URL中使用中文等非ASCII的字符造成服务器后台程序解析出现乱码的问题。
常见出错部分也就是容易出现中文字符的部分：
（1）Query String中的参数值
（2）servlet path
常见出错原因（1）浏览器：我们的客户端（浏览器）本身并没有遵循URI编码的规范。
（2）Servlet服务器：Servlet服务器的没有正确配置。
（3）开发人员并不了解Servlet的规范和API的含义。
servlet规范（1）HttpServletRequest.setCharacterEncoding（）方法 仅仅只适用于设置post提交的requestboda的编码而不是设置get方法提交的queryString的编码。该方法告诉应用服务器应该采用什么编码解析post传过来的内容。
（2） HttpServletRequest.getPathInfo（）返回的结果是由Servlet服务器解码（decode）过的。
（3） HttpServletRequest.getRequestURI（）返回的字符串没有被Servlet服务器decoded过。
（4） POST提交的数据是作为request body的一部分。
（5） 网页的Http头中ContentType("text/html; charset=GBK")的作用：
(a) 告诉浏览器网页中数据是什么编码；
(b) 表单提交时，通常浏览器会根据ContentType指定的charset对表单中的数据编码，然后发送给服务器的。
注意：这里所说的ContentType是指http头的ContentType，而不是在网页中mete中的ContentType。