最近工作中遇到中文编码,中文参数传递,AJAX返回值包含中文乱码的问题,为此奋斗了一宿,有点心得,有点体会,总结如下,希望对迷惑于此中者有解惑之功效!

      在网上一阵狠搜,编码函数的确是有,包括Javascript的和ASP的。本文先总结几个有用的ASP中的编码与解码函数,代码如下:

      第一组函数:VB_URLEncode()和VB_URLDecode()

 1网页编码与数据传递中的中文字符编码'--------------------------------------------------------------------------
 2网页编码与数据传递中的中文字符编码'==============================================================
 3网页编码与数据传递中的中文字符编码'功能:ASP Server对象内置编码函数
 4网页编码与数据传递中的中文字符编码'描述:没有对应的解码函数
 5网页编码与数据传递中的中文字符编码'==============================================================
 6网页编码与数据传递中的中文字符编码Function VB_URLEncode(enStr)
 7网页编码与数据传递中的中文字符编码    VB_URLEncode = Server.URLEncode(enStr)
 8网页编码与数据传递中的中文字符编码End Function
 9网页编码与数据传递中的中文字符编码
10网页编码与数据传递中的中文字符编码'==============================================================
11网页编码与数据传递中的中文字符编码'功能:Server.URLEncode()的解码函数
12网页编码与数据传递中的中文字符编码'描述:目前该函数还未完善
13网页编码与数据传递中的中文字符编码'       当本页面为UTF-8编码时,源字符串中包含如下格式子字符串时:
14网页编码与数据传递中的中文字符编码'                    "编码aa测aa试"
15网页编码与数据传递中的中文字符编码'      函数无法对VB_URLEncode()之后的编码进行解码
16网页编码与数据传递中的中文字符编码'      当本页面为GB2312编码是,该函数工作正常。
17网页编码与数据传递中的中文字符编码'==============================================================
18网页编码与数据传递中的中文字符编码Function VB_URLDecode(enStr)
19网页编码与数据传递中的中文字符编码    dim deStr,strSpecial
20网页编码与数据传递中的中文字符编码    dim c,i,v
21网页编码与数据传递中的中文字符编码    deStr=""
22网页编码与数据传递中的中文字符编码    strSpecial="!""#$%&'()*+,.-_/:;<=>?@[\]^`{|}~%"
23网页编码与数据传递中的中文字符编码    For i=1 To len(enStr)
24网页编码与数据传递中的中文字符编码        c=Mid(enStr,i,1)
25网页编码与数据传递中的中文字符编码        If c="%" Then
26网页编码与数据传递中的中文字符编码            v=eval("&h"+Mid(enStr,i+1,2))
27网页编码与数据传递中的中文字符编码            If inStr(strSpecial,chr(v))>0 Then
28网页编码与数据传递中的中文字符编码                deStr=deStr&chr(v)
29网页编码与数据传递中的中文字符编码                i=i+2
30网页编码与数据传递中的中文字符编码            Else
31网页编码与数据传递中的中文字符编码                v=eval("&h"+ Mid(enStr,i+1,2+ Mid(enStr,i+4,2))
32网页编码与数据传递中的中文字符编码                deStr=deStr & chr(v)
33网页编码与数据传递中的中文字符编码                i=i+5
34网页编码与数据传递中的中文字符编码            End If
35网页编码与数据传递中的中文字符编码        Else
36网页编码与数据传递中的中文字符编码            If c="+" Then
37网页编码与数据传递中的中文字符编码                deStr=deStr&" "
38网页编码与数据传递中的中文字符编码            Else
39网页编码与数据传递中的中文字符编码                deStr=deStr&c
40网页编码与数据传递中的中文字符编码            End If
41网页编码与数据传递中的中文字符编码        End If
42网页编码与数据传递中的中文字符编码    Next
43网页编码与数据传递中的中文字符编码    VB_URLDecode=deStr
44网页编码与数据传递中的中文字符编码End Function 

       第二组函数:VB_GBtoUTF8()和VB_UTF8toGB()
      VB_GBtoUTF8()代码如下:

 1网页编码与数据传递中的中文字符编码'===========================================
 2网页编码与数据传递中的中文字符编码'功能:对中文字符进行编码,由GB2312转换为UTF-8
 3网页编码与数据传递中的中文字符编码'描述:与UTF8toGB()互逆
 4网页编码与数据传递中的中文字符编码'     编码后的格式可用于页面之间的数据传递,但无法
 5网页编码与数据传递中的中文字符编码'     正确显示在HTML页面,需要UTF8toGB()解码。
 6网页编码与数据传递中的中文字符编码'===========================================
 7网页编码与数据传递中的中文字符编码Function VB_GBtoUTF8(szInput)
 8网页编码与数据传递中的中文字符编码    Dim wch, uch, szRet
 9网页编码与数据传递中的中文字符编码    Dim x
10网页编码与数据传递中的中文字符编码    Dim nAsc, nAsc2, nAsc3
11网页编码与数据传递中的中文字符编码    '如果输入参数为空,则退出函数
12网页编码与数据传递中的中文字符编码    If szInput = "" Then
13网页编码与数据传递中的中文字符编码        VB_GBtoUTF8 = szInput
14网页编码与数据传递中的中文字符编码        Exit Function
15网页编码与数据传递中的中文字符编码    End If
16网页编码与数据传递中的中文字符编码    '开始转换
17网页编码与数据传递中的中文字符编码    For x = 1 To Len(szInput)
18网页编码与数据传递中的中文字符编码        '利用mid函数分拆GB编码文字
19网页编码与数据传递中的中文字符编码        wch = Mid(szInput, x, 1)
20网页编码与数据传递中的中文字符编码        '利用ascW函数返回每一个GB编码文字的Unicode字符代码
21网页编码与数据传递中的中文字符编码        '注:asc函数返回的是ANSI 字符代码,注意区别
22网页编码与数据传递中的中文字符编码        nAsc = AscW(wch)
23网页编码与数据传递中的中文字符编码        If nAsc < 0 Then nAsc = nAsc + 65536
24网页编码与数据传递中的中文字符编码        
25网页编码与数据传递中的中文字符编码        If (nAsc And &HFF80) = 0 Then
26网页编码与数据传递中的中文字符编码            szRet = szRet & wch
27网页编码与数据传递中的中文字符编码        Else
28网页编码与数据传递中的中文字符编码            If (nAsc And &HF000) = 0 Then
29网页编码与数据传递中的中文字符编码                uch = "%" & Hex(((nAsc \ 2 ^ 6)) Or &HC0) & Hex(nAsc And &H3F Or &H80)
30网页编码与数据传递中的中文字符编码                szRet = szRet & uch
31网页编码与数据传递中的中文字符编码            Else
32网页编码与数据传递中的中文字符编码                'GB编码文字的Unicode字符代码在0800 - FFFF之间采用三字节模版
33网页编码与数据传递中的中文字符编码                uch = "%" & Hex((nAsc \ 2 ^ 12Or &HE0) & "%" & _
34网页编码与数据传递中的中文字符编码                Hex((nAsc \ 2 ^ 6And &H3F Or &H80) & "%" & _
35网页编码与数据传递中的中文字符编码                Hex(nAsc And &H3F Or &H80)
36网页编码与数据传递中的中文字符编码                szRet = szRet & uch
37网页编码与数据传递中的中文字符编码            End If
38网页编码与数据传递中的中文字符编码        End If
39网页编码与数据传递中的中文字符编码    Next
40网页编码与数据传递中的中文字符编码    VB_GBtoUTF8 = szRet
41网页编码与数据传递中的中文字符编码End Function

      VB_UTF8toGB()代码如下:

  1网页编码与数据传递中的中文字符编码'===========================================
  2网页编码与数据传递中的中文字符编码'功能:对中文字符进行编码,由UTF-8转换为GB2312
  3网页编码与数据传递中的中文字符编码'描述:VB_GBtoUTF8()的解码函数
  4网页编码与数据传递中的中文字符编码'===========================================
  5网页编码与数据传递中的中文字符编码Function VB_UTF8toGB(UTFStr)
  6网页编码与数据传递中的中文字符编码    For Dig=1 To len(UTFStr) 
  7网页编码与数据传递中的中文字符编码        '如果UTF8编码文字以%开头则进行转换
  8网页编码与数据传递中的中文字符编码        If mid(UTFStr,Dig,1)="%" Then 
  9网页编码与数据传递中的中文字符编码            'UTF8编码文字大于8则转换为汉字
 10网页编码与数据传递中的中文字符编码            If len(UTFStr) >= Dig+8 Then 
 11网页编码与数据传递中的中文字符编码                GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9)) 
 12网页编码与数据传递中的中文字符编码                Dig=Dig+8 
 13网页编码与数据传递中的中文字符编码            Else 
 14网页编码与数据传递中的中文字符编码                GBStr=GBStr & mid(UTFStr,Dig,1
 15网页编码与数据传递中的中文字符编码            End If 
 16网页编码与数据传递中的中文字符编码        Else 
 17网页编码与数据传递中的中文字符编码            GBStr=GBStr & mid(UTFStr,Dig,1
 18网页编码与数据传递中的中文字符编码        End If 
 19网页编码与数据传递中的中文字符编码    Next 
 20网页编码与数据传递中的中文字符编码    VB_UTF8toGB=GBStr 
 21网页编码与数据传递中的中文字符编码End Function 
 22网页编码与数据传递中的中文字符编码
 23网页编码与数据传递中的中文字符编码'UTF8编码文字将转换为汉字
 24网页编码与数据传递中的中文字符编码Function ConvChinese(x) 
 25网页编码与数据传递中的中文字符编码    A=split(mid(x,2),"%"
 26网页编码与数据传递中的中文字符编码    i=0 
 27网页编码与数据传递中的中文字符编码    j=0 
 28网页编码与数据传递中的中文字符编码    For i=0 To ubound(A) 
 29网页编码与数据传递中的中文字符编码        A(i)=c16to2(A(i)) 
 30网页编码与数据传递中的中文字符编码    Next 
 31网页编码与数据传递中的中文字符编码    For i=0 To ubound(A)-1 
 32网页编码与数据传递中的中文字符编码        DigS=instr(A(i),"0"
 33网页编码与数据传递中的中文字符编码        Unicode="" 
 34网页编码与数据传递中的中文字符编码        For j=1 To DigS-1 
 35网页编码与数据传递中的中文字符编码            If j=1 Then 
 36网页编码与数据传递中的中文字符编码                A(i)=right(A(i),len(A(i))-DigS) 
 37网页编码与数据传递中的中文字符编码                Unicode=Unicode & A(i) 
 38网页编码与数据传递中的中文字符编码            Else 
 39网页编码与数据传递中的中文字符编码                i=i+1 
 40网页编码与数据传递中的中文字符编码                A(i)=right(A(i),len(A(i))-2
 41网页编码与数据传递中的中文字符编码                Unicode=Unicode & A(i) 
 42网页编码与数据传递中的中文字符编码            End If 
 43网页编码与数据传递中的中文字符编码        Next 
 44网页编码与数据传递中的中文字符编码
 45网页编码与数据传递中的中文字符编码        If len(c2to16(Unicode))=4 Then 
 46网页编码与数据传递中的中文字符编码            ConvChinese=ConvChinese & chrw(int("&H" & c2to16(Unicode))) 
 47网页编码与数据传递中的中文字符编码        Else 
 48网页编码与数据传递中的中文字符编码            ConvChinese=ConvChinese & chr(int("&H" & c2to16(Unicode))) 
 49网页编码与数据传递中的中文字符编码        End If 
 50网页编码与数据传递中的中文字符编码    Next 
 51网页编码与数据传递中的中文字符编码End Function 
 52网页编码与数据传递中的中文字符编码
 53网页编码与数据传递中的中文字符编码'二进制代码转换为十六进制代码
 54网页编码与数据传递中的中文字符编码Function c2to16(x)
 55网页编码与数据传递中的中文字符编码    i=1 
 56网页编码与数据传递中的中文字符编码    For i=1 To len(x) step 4 
 57网页编码与数据传递中的中文字符编码        c2to16=c2to16 & hex(c2to10(mid(x,i,4))) 
 58网页编码与数据传递中的中文字符编码    Next 
 59网页编码与数据传递中的中文字符编码End Function 
 60网页编码与数据传递中的中文字符编码
 61网页编码与数据传递中的中文字符编码'二进制代码转换为十进制代码
 62网页编码与数据传递中的中文字符编码Function c2to10(x)
 63网页编码与数据传递中的中文字符编码    c2to10=0 
 64网页编码与数据传递中的中文字符编码    If x="0" Then Exit Function 
 65网页编码与数据传递中的中文字符编码    i=0 
 66网页编码与数据传递中的中文字符编码    For i= 0 To len(x) -1 
 67网页编码与数据传递中的中文字符编码        If mid(x,len(x)-i,1)="1" Then c2to10=c2to10+2^(i) 
 68网页编码与数据传递中的中文字符编码    Next 
 69网页编码与数据传递中的中文字符编码End Function 
 70网页编码与数据传递中的中文字符编码
 71网页编码与数据传递中的中文字符编码'十六进制代码转换为二进制代码
 72网页编码与数据传递中的中文字符编码Function c16to2(x) 
 73网页编码与数据传递中的中文字符编码    i=0 
 74网页编码与数据传递中的中文字符编码    For i=1 To len(trim(x)) 
 75网页编码与数据传递中的中文字符编码        tempstr= c10to2(cint(int("&h" & mid(x,i,1)))) 
 76网页编码与数据传递中的中文字符编码        Do While len(tempstr)<4 
 77网页编码与数据传递中的中文字符编码            tempstr="0" & tempstr 
 78网页编码与数据传递中的中文字符编码        Loop 
 79网页编码与数据传递中的中文字符编码        c16to2=c16to2 & tempstr 
 80网页编码与数据传递中的中文字符编码    Next 
 81网页编码与数据传递中的中文字符编码End Function 
 82网页编码与数据传递中的中文字符编码
 83网页编码与数据传递中的中文字符编码'十进制代码转换为二进制代码
 84网页编码与数据传递中的中文字符编码Function c10to2(x) 
 85网页编码与数据传递中的中文字符编码    mysign=sgn(x) 
 86网页编码与数据传递中的中文字符编码    x=abs(x) 
 87网页编码与数据传递中的中文字符编码    DigS=1 
 88网页编码与数据传递中的中文字符编码    Do 
 89网页编码与数据传递中的中文字符编码        If x<2^DigS Then 
 90网页编码与数据传递中的中文字符编码            Exit Do 
 91网页编码与数据传递中的中文字符编码        Else 
 92网页编码与数据传递中的中文字符编码            DigS=DigS+1 
 93网页编码与数据传递中的中文字符编码        End If 
 94网页编码与数据传递中的中文字符编码    Loop 
 95网页编码与数据传递中的中文字符编码    tempnum=
 96网页编码与数据传递中的中文字符编码
 97网页编码与数据传递中的中文字符编码    i=0 
 98网页编码与数据传递中的中文字符编码    For i=DigS To 1 step-1 
 99网页编码与数据传递中的中文字符编码        If tempnum>=2^(i-1Then 
100网页编码与数据传递中的中文字符编码            tempnum=tempnum-2^(i-1
101网页编码与数据传递中的中文字符编码            c10to2=c10to2 & "1" 
102网页编码与数据传递中的中文字符编码        Else 
103网页编码与数据传递中的中文字符编码            c10to2=c10to2 & "0" 
104网页编码与数据传递中的中文字符编码        End If 
105网页编码与数据传递中的中文字符编码    Next 
106网页编码与数据传递中的中文字符编码    If mysign=-1 Then c10to2="-" & c10to2 
107网页编码与数据传递中的中文字符编码End Function

      测试代码如下:

 1 <html>
 2 <head>
 3 <meta http-equiv="content-type" content="text/html; charset=gb2312" />
 4 <title>字符编码测试</title>
 5 </head>
 6 <style type="text/css">
 7     body{ margin:20px 10px; line-height: 140%; font-size:12px; color:blue;}
 8 </style>
 9 <body>
10 <
11     On Error Resume Next
12     str = "##testingTest$$##编码aa测aa试aa##!!67&#=;"
13     Response.Write("源字符串: " & str & "<BR>")
14     str1 = VB_URLEncode(str)
15     str2 = VB_URLDecode(str1)
16     Response.Write("VB_URLEncode: " & str1 & "<BR>")
17     Response.Write("VB_URLDecode: " & str2 & "<BR>")
18     If str2 = str Then Response.Write("结果==>解码正确, URLEncode对字符串中除26个英文字母(包括大小写)之外的所有字符都进行编码,中文字符为2字节,非中文字符1字节<BR>")
19     Response.Write("------------------------------------------------------- <BR>")
20     str3 = VB_GBtoUTF8(str)
21     str4 = VB_UTF8toGB(str3)
22     Response.Write("VB_GBtoUTF8: " & str3 & "<BR>")
23     Response.Write("VB_UTF8toGB: " & str4 & "<BR>")
24     If str4 = str Then Response.Write("结果==>解码正确,GBtoUTF8只对中文字符编码,按每个中文字符3字节编码<BR>")
25     Response.End()
26 %>
27 </body>
28 </html>

       测试结果如下:

源字符串: ##testingTest$$##编码aa测aa试aa##!!67&#=;
VB_URLEncode: %
23%23testingTest%24%24%23%23%B1%E0%C2%EBaa%B2%E2aa%CA%D4aa%23%23%21%2167%26%23%3D%3B
VB_URLDecode: ##testingTest$$##编码aa测aa试aa##!!
67&#=;
结果
==>解码正确, URLEncode对字符串中除26个英文字母(包括大小写)之外的所有字符都进行编码,中文字符为2字节,非中文字符1字节
------------------------------------------------------- 
VB_GBtoUTF8: ##testingTest$$##%E7%BC%
96%E7%A0%81aa%E6%B5%8Baa%E8%AF%95aa##!!67&#=;
VB_UTF8toGB: ##testingTest$$##编码aa测aa试aa##!!
67&#=;
结果
==>解码正确,GBtoUTF8只对中文字符编码,按每个中文字符3字节编码

      如上测试代码在gb2312编码下运行OK,如若将网页编码换为utf-8的话,VB_URLDecode()解码在某些情况下会发生错误,比如上面代码就是这样。具体情形我在该函数源码上有说明。

      有了这两组编码函数后,就可以很方便的避免路径参数传递,网页数据传递中的中文乱码问题。

      够详细了吧,这里只介绍了ASP下的2组编码与解码函数,还有一些其他的编码函数我就不深究了。另外还有ASP编码后的字符串如何用javascript来解码,这点在AJAX应用上有突出的体现。鉴于技术问题,接着研究去,这个就留在下篇解说!

      如有不正确的地方,欢迎拍砖!鞠躬下台···

      附上完整的函数及测试代码:charEncode.rar

相关文章:

  • 2021-06-29
  • 2021-05-09
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-27
  • 2022-12-23
  • 2021-11-17
  • 2022-12-23
  • 2022-02-16
  • 2022-12-23
  • 2021-12-05
相关资源
相似解决方案