发射的客户端,查询字符串代码为:
`?${char}=${printcode}`
char是未转义的字符,printcode是整数,表达为十六进制。例如!感叹号发送要求,将会是:
34;?!=21"
做事器端,我们测试ASP.NET的吸收情形,其代码是:
_logger.LogInformation("{0}{1}", this.Request.QueryString.Value, stringify(this.Request.Query))
输出的第一部分是做事器端吸收到要求的escaped字符串。第二部分是Query解析后的键值对。stringify是将其序列化的函数,细节忽略。
很明显,不可打印的非掌握字符将会百分号转义。非ascii字符也会被百分号转义。我们测试可打印ascii字符(32~127)的转义情形。
和我们预想的一样,数字和字母,不转义:
?0=30["0","30"]...?9=39["9","39"]?A=41["A","41"]...?Z=5A["Z","5A"]?a=61["a","61"]...?z=7A["z","7A"]
其他不转义的符号有:
?!=21["!","21"]?$=24["$","24"]?(=28["(","28"]?)=29[")","29"]?=2A["","2A"]?,=2C[",","2C"]?-=2D["-","2D"]?.=2E[".","2E"]?/=2F["/","2F"]?:=3A[":","3A"]?;=3B[";","3B"]??=3F["?","3F"]?@=40["@","40"]?[=5B["[","5B"]?\=5C["\\","5C"]?]=5D["]","5D"]?^=5E["^","5E"]?_=5F["_","5F"]?`=60["`","60"]?{=7B["{","7B"]?|=7C["|","7C"]?}=7D["}","7D"]?~=7E["~","7E"]
下面这些是字符有特定的用场,浏览器不会自动转义,如表示原义须要手工转义,避免做事器阐明缺点:
?[]//#23:#表示查询字符串的结束,以是查询字符串只有一个问号?%=25["%","25"] //表示百分号编码的关键字?&=26["","26"] //键值对的分隔符?+=2B[" ","2B"] //被Query解析为空格?==3D["","=3D"] //键与值的分隔符
下面这些是可以自动被浏览器百分号转义的字符:
?%20=20[" ","20"]?%22=22["\"","22"]?%27=27["'","27"]?%3C=3C["<","3C"]?%3E=3E[">","3E"]?%7F=7F["\u007F","7F"]
后记
URL转义规则一贯在不断变革,对付新版本升级,我们须要不断地进行回归测试。