Jquery 编码 续篇 gb2312 的噩梦
2008-04-17 03:10 废墟中的垃圾 阅读(3236) 评论(2) 收藏 举报Jquery 大哥还真是强大,跨浏览器支持真不错,而且插件很多,用起来比较爽。
Ajax地方就好像有点不像大哥了,数据传递编码仅支持UTF-8,这个虽然是全球统一编码,但是虽不是稍微考虑一下各国程序员的本地网站编码问题啊?特别是,数据库都几十个G了,原文的本地化编码,你让他完全修改成UTF-8是不是也不太合适阿?
先介绍一下正常的网页编码问题。
网页编码有程序级编码和页面级编码
在不同语言里面方法不一样,有设置 Pagecode 的也有设置 response的charset
如果想要不出乱码,那么页面也必须显式的设置html 的charset
两个匹配,则页面输出正常。
下面按照中国的gb2312编码前提说明。
现在开始说jquery 的ajax 。在jquery的发送端,无论你设置了程序级编码还是页面级编码,jquery都会使用utf-8的编码方式传递过去。
所以接收端的问题就来了。下面按照接收英文和接收中文两个方式来讨论。
1。英文,接收不存在任何的编码问题。但是在输出的时候,如果输出了中文就会报错。这里的解决方案是在程序级别输出charset 为gb2312
2。中文,这里接收就会出很大问题。如果普通设置一定会乱码,无论你是设置了页面级编码还是程序级编码。
这里有两种解决方案。
第一种,就是通过编码转换。这里面.net 和java就比较成熟,可以很容易的在字符串之间转换编码格式。但是asp比较郁闷了。转换效率低下到一定境界,而且转换也可能出错。
第二种是比较好的方案。在ajax发送端使用escape方法。然后在接收端使用 unescape方法转换。当然这里.net和java的方法比较多了,而且可以通过第一种方案解决。如果asp的话,下面给出unescape的过程(这个过程是网上转的,没有具体出处了,所以是某位大哥的原创,对不起了:))。这样就可以解决中文乱码问题了。
bigqiang 兄弟指出VBScript角本解释引擎从5.6版本开始已经有了Unescape这个函数
所以大家可以直接使用这两个函数,下面的代码保留,让大家可以了解得更加具体一些。
<%
'escape()函数实现,不变的7个符号: *(42) +(43) -(45) .(46) /(47) @(64) _(95)2
Function VBsEscape(str)3
dim i,s,c,a4
s=""5
For i=1 to Len(str)6
c=Mid(str,i,1)7
a=ASCW(c)8
If (a>=48 and a<=57) or (a>=65 and a<=90) or (a>=97 and a<=122) Then9
s = s & c10
ElseIf InStr("@*_+-./",c)>0 Then11
s = s & c12
ElseIf a>0 and a<16 Then13
s = s & "%0" & Hex(a)14
ElseIf a>=16 and a<256 Then15
s = s & "%" & Hex(a)16
Else17
s = s & "%u" & Hex(a)18
End If19
Next20
VBsEscape = s21
End Function22

23
'unescape()函数24
Function VBsUnEscape(str)25
dim i,s,c26
s=""27
For i=1 to Len(str)28
c=Mid(str,i,1)29
If Mid(str,i,2)="%u" and i<=Len(str)-5 Then30
If IsNumeric("&H" & Mid(str,i+2,4)) Then31
s = s & CHRW(CInt("&H" & Mid(str,i+2,4)))32
i = i+533
Else34
s = s & c35
End If36
ElseIf c="%" and i<=Len(str)-2 Then37
If IsNumeric("&H" & Mid(str,i+1,2)) Then38
s = s & CHRW(CInt("&H" & Mid(str,i+1,2)))39
i = i+240
Else41
s = s & c42
End If43
Else44
s = s & c45
End If46
Next47
VBsUnEscape = s48
End Function49

50

%>
希望可以给遇到麻烦的朋友解决一些问题:)
浙公网安备 33010602011771号