ASP使用ajax来传递中文参数的编码处理
背景
asp的第一版是0.9测试版,自从1996年asp1.0诞生,迄今20余载。虽然asp在windows2000 iis服务5.0所附带的asp 3.0发布后好像再没有更新过了,但是由于其入手简单,天然的asp+access零配置,在零几年火的就像现在的微信小程序。虽然时过境迁,其至今在国内还有小规模的用户市场。
据工信部发布消息,截止到2018年底,中国中小企业的数量已经超过了3000万家,个体工商户数量超过7000万户。中小企业信息化普遍面临资金短缺、信息人才不足等问题,为了降低成本,故而企业网站一般外包给其他小规模的网络公司制作、维护,网络公司一般是套站、仿站。操作系统一般使用windows,web程序搭建上,一般使用php+mysql或者asp+access的“黄金”组合。
实践
这不,笔者最近又用上了asp+access,不过不是企业站的,而是一个小型的教学管理系统。
开发过程中碰到一个问题,asp页面前后端都是用的gb2312编码,前端使用ajax来传递中文参数,后端进行编码处理后,以免存入access为乱码。
注:建议前后端都是用utf-8编码,就没下面这么麻烦了。
前端代码:
$.post("result.asp?act=update",{ val: escape(val) },function(result){ result = json.parse(result); });
后端代码:
dim val val = trim(vbsunescape(request.form("val")))
ecmascript v3 已从标准中删除了 escape() 函数和 unescape() 函数,并反对使用它们,因此应该使用 decodeuri() 和 decodeuricomponent() 取而代之。
… all of the language features and behaviours specified in this annex have one or more undesirable characteristics and in the absence of legacy usage would be removed from this specification. …
https://www-archive.mozilla.org/js/language/e262-3.pdf
… programmers should not use or assume the existence of these features and behaviours when writing new ecmascript code. …
https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/escape
function vbsunescape(str) dim i,s,c s="" for i=1 to len(str) c=mid(str,i,1) if mid(str,i,2)="%u" and i<=len(str)-5 then if isnumeric("&h" & mid(str,i+2,4)) then s=s & chrw(cint("&h" & mid(str,i+2,4))) i=i+5 else s=s & c end if elseif c="%" and i<=len(str)-2 then if isnumeric("&h" & mid(str,i+1,2)) then s=s & chrw(cint("&h" & mid(str,i+1,2))) i=i+2 else s=s & c end if else s=s & c end if next vbsunescape=s end function
另附上一般这里用不上的vbsescape:
'escape时不变的7个符号: *(42) +(43) -(45) .(46) /(47) @(64) _(95) function vbsescape(str) dim i,s,c,a s="" for i=1 to len(str) c=mid(str,i,1) a=ascw(c) if (a>=48 and a<=57) or (a>=65 and a<=90) or (a>=97 and a<=122) then s = s & c elseif instr("@*_+-./",c)>0 then s = s & c elseif a>0 and a<16 then s = s & "%0" & hex(a) elseif a>=16 and a<256 then s = s & "%" & hex(a) else s = s & "%u" & hex(a) end if next vbsescape = s end function
如果,在前端使用的是encodeuri/encodeuricomponent,而不是escape,那么,后端还可以像下面这样写:
<% function strdecode(str) dim objscript set objscript = server.createobject("scriptcontrol") objscript.language = "javascript" strdecode = objscript.eval("decodeuricomponent(""" & str & """.replace(/\+/g,"" ""))") set objscript = nothing end function %>
上面的vbsunescape函数也可以这么写!
原文: