Ajax技术是一种很流行,并且也很容易使用的技术,但是我们经常会遇到一个问题就是ajax中文乱码问题。
在我们使用ajax返回参数时经常会发现前台显示的是一堆乱码,而产生乱码的主要原因有:
(1) xtmlhttp 返回的数据默认的字符编码是“utf-8”,如果前台页面是“gb2312”或者其它编码数据就会产生乱码
(2) post 方法提交数据默认的字符编码是“utf-8”,如果后台是“gb2312”或其他编码数据就会产生乱码
解决的办法就是在送出的流里面加一个HEADER,指明送出的是什么编码流,这样XMLHTTP就不会乱搞了。
PHP:header('Content-Type:text/html;charset=GB2312');
ASP:Response.Charset("GB2312")
JSP:response.setHeader("Charset","GB2312");
ASP:Response.Charset("GB2312")
JSP:response.setHeader("Charset","GB2312");
上面所说的方法,在异步获取数据时是有效的,但是,在异步提交数据时往往会失效,哪怕在我们提交数据时用上了 Javascript 的函数 escape() 对提交的数据进行编码。因此,解决Ajax乱码最完美的方法,看来只有将网页的编码改用“utf-8”,至少是与 Ajax 相关的所有网页必须用“utf-8”编码。
今天在做一个注册和登陆的页面时,我使用是Jquery里面的Ajax技术进行数据提交,刚开始使用英文注册没有发现什么问题,但是后面使用中文注册发现显示了一堆乱码,并且保存在数据库中的也是乱码,于是我就查找原因,发现使用上面的方法无法解决,后来我发现在使用ajax Post方法提交了参数之后所有的中文字符马上被成了乱码,于是我怀疑是JQuery的ajax传参时产生了乱码,于是我在网上搜索了一下,发现了一下的解决方法,首先将要进行提交的参数使用javascript的escape函数进行编码,然后再进行数据提交,然后在参数的接收页面进行解码,但是因为原因是使用javascritp进行的编码,所以不能直接在asp中使用vbscript进行解码,于是在网上看到了一个可以在Vbscript对Javascript编码的字符进行解码的函数,于是就试了一下,问题解决。
下面是ASP 下的escape() 函数和unescape() 函数的具体实现代码,escape函数实现原理将中文字符转换为十六进制编码进行传递,unesape函数则相反:
<%
'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
'unescape()函数
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
%>
'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
'unescape()函数
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
%>