代码改变世界

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这个函数
所以大家可以直接使用这两个函数,下面的代码保留,让大家可以了解得更加具体一些。

<%

 1'escape()函数实现,不变的7个符号: *(42) +(43) -(45) .(46) /(47) @(64) _(95)
 2Function VBsEscape(str)
 3  dim i,s,c,a
 4  s=""
 5  For i=1 to Len(str)
 6  c=Mid(str,i,1)
 7  a=ASCW(c)
 8  If (a>=48 and a<=57or (a>=65 and a<=90or (a>=97 and a<=122Then
 9  s = s & c
10  ElseIf InStr("@*_+-./",c)>0 Then
11  s = s & c
12  ElseIf a>0 and a<16 Then
13  s = s & "%0" & Hex(a)
14  ElseIf a>=16 and a<256 Then
15  s = s & "%" & Hex(a)
16  Else
17  s = s & "%u" & Hex(a)
18  End If
19  Next
20  VBsEscape = s
21End Function
22
23'unescape()函数
24Function VBsUnEscape(str)
25  dim i,s,c
26  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 Then
30  If IsNumeric("&H" & Mid(str,i+2,4)) Then
31  s = s & CHRW(CInt("&H" & Mid(str,i+2,4)))
32  i = i+5
33  Else
34  s = s & c
35  End If
36  ElseIf c="%" and i<=Len(str)-2 Then
37  If IsNumeric("&H" & Mid(str,i+1,2)) Then
38  s = s & CHRW(CInt("&H" & Mid(str,i+1,2)))
39  i = i+2
40  Else
41  s = s & c
42  End If
43  Else
44  s = s & c
45  End If
46  Next
47  VBsUnEscape = s
48End Function
49
50

%>

希望可以给遇到麻烦的朋友解决一些问题:)