欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ASP使用ajax来传递中文参数的编码处理

程序员文章站 2022-05-18 20:48:47
背景 asp的第一版是0.9测试版,自从1996年ASP1.0诞生,迄今20余载。虽然asp在Windows2000 IIS服务5.0所附带的ASP 3.0发布后好像再没有更新过了,但是由于其入手简单,天然的asp+access零配置,在零几年火的就像现在的微信小程序。虽然时过境迁,其至今在国内还有 ......

背景

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. …
… programmers should not use or assume the existence of these features and behaviours when writing new ecmascript code. …

https://www-archive.mozilla.org/js/language/e262-3.pdf
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函数也可以这么写!

原文: