ASP在UTF-8页面下将GB2312模式下编码字符串转换为汉字

作者: 来源: 更新时间:2012-09-09 15:45:13 点击:

今天做个小功能的时候遇到的问题,我当前的页面是utf-8编码,获取百度来源url中的汉字编码有可能是gb下的,在网上搜了很久,解决方法最多的一个例子是利用xmlhttp远程请求一下再次获取,但这样无疑加重了代码的执行效率,其他更好的方法也没搜到,但这个方法肯定不能立即使用的,所以最终想到了另个办法。

举个例子,如:“汉字”

在utf-8下的编码为:%E6%B1%89%E5%AD%97

在gb2312下的编码为:?%BA%BA%D7%D6

而我的hga021.com|首页当前为utf-8编码下,那么如何将这些纯粹的编码字符串转换为汉字呢?

首先,我的页面中要包含下面这个函数:

Function URLDecode(enStr)
?? ?Dim deStr,strSpecial
?? ?Dim c,i,v
?? ?deStr=""
?? ?strSpecial="!""#$%&'()*+,.-_/:;<=>[email?protected][\]^`{|}~%"
?? ?For i=1 To Len(enStr)
?? ??? ?c=Mid(enStr,i,1)
?? ??? ?If c="%" Then
?? ??? ??? ?v=eval("&h"+Mid(enStr,i+1,2))
?? ??? ??? ?If inStr(strSpecial,Chr(v))>0 Then
?? ??? ??? ??? ?deStr=deStr&Chr(v)
?? ??? ??? ??? ?i=i+2
?? ??? ??? ?Else
?? ??? ??? ??? ?v=eval("&h"+ Mid(enStr,i+1,2) + Mid(enStr,i+4,2))
?? ??? ??? ??? ?deStr=deStr & Chr(v)
?? ??? ??? ??? ?i=i+5
?? ??? ??? ?End If
?? ??? ?Else
?? ??? ??? ?If c="+" Then
?? ??? ??? ??? ?deStr=deStr&" "
?? ??? ??? ?Else
?? ??? ??? ??? ?deStr=deStr&c
?? ??? ??? ?End If
?? ??? ?End If
?? ?Next
?? ?URLDecode=deStr
End Function

上面这个函数是一个url解码函数,下面的函数是utf-8编码转换为汉字的函数:

Function UTF2GB(utfStr)
?? ?For Dig=1 To Len(utfStr)
?? ??? ?'如果UTF8编码文字以%开头则进行转换
?? ??? ?If mid(UTFStr,Dig,1)="%" Then
?? ??? ??? ?'UTF8编码文字大于8则转换为汉字
?? ??? ??? ?If Len(UTFStr) >= Dig+8 Then
?? ??? ??? ??? ?GBStr=GBStr & ConvChinese(mid(UTFStr,Dig,9))
?? ??? ??? ??? ?Dig=Dig+8
?? ??? ??? ?Else
?? ??? ??? ??? ?GBStr=GBStr & mid(UTFStr,Dig,1)
?? ??? ??? ?End If
?? ??? ?Else
?? ??? ??? ?GBStr=GBStr & mid(UTFStr,Dig,1)
?? ??? ?End If
?? ?Next
?? ?UTF2GB = GBStr
End Function
'UTF8编码文字将转换为汉字
Function ConvChinese(x)
?? ?A=split(mid(x,2),"%")
?? ?i=0
?? ?j=0
?? ?For i=0 To UBound(A)
?? ??? ?A(i)=c16to2(A(i))
?? ?Next
?? ?For i=0 To UBound(A)-1
?? ??? ?DigS=InStr(A(i),"0")
?? ??? ?Unicode=""
?? ??? ?For j=1 To DigS-1
?? ??? ??? ?If j=1 Then
?? ??? ??? ??? ?A(i)=Right(A(i),Len(A(i))-DigS)
?? ??? ??? ??? ?Unicode=Unicode & A(i)
?? ??? ??? ?Else
?? ??? ??? ??? ?i=i+1
?? ??? ??? ??? ?A(i)=Right(A(i),Len(A(i))-2)
?? ??? ??? ??? ?Unicode=Unicode & A(i)
?? ??? ??? ?End If
?? ??? ?Next
?? ??? ?If Len(c2to16(Unicode))=4 Then
?? ??? ??? ?ConvChinese=ConvChinese & Chrw(Int("&H" & c2to16(Unicode)))
?? ??? ?Else
?? ??? ??? ?ConvChinese=ConvChinese & Chr(Int("&H" & c2to16(Unicode)))
?? ??? ?End If
?? ?Next
End Function
'二进制代码转换为十六进制代码
Function c2to16(x)
?? ?i=1
?? ?For i=1 To len(x) Step 4
?? ??? ?c2to16=c2to16 & Hex(c2to10(Mid(x,i,4)))
?? ?Next
End Function
'二进制代码转换为十进制代码
Function? c2to10(x)
?? ?c2to10=0
?? ?If x="0" Then Exit Function
?? ?i=0
?? ?For i= 0 To Len(x) -1
?? ??? ?If Mid(x,Len(x)-i,1)="1" Then c2to10=c2to10+2^(i)
?? ?Next
End Function
'十六进制代码转换为二进制代码
Function c16to2(x)
?? ?i=0
?? ?For i=1 To Len(Trim(x))
?? ??? ?tempstr= c10to2(CInt(Int("&h" & Mid(x,i,1))))
?? ??? ?Do While Len(tempstr)<4
?? ??? ??? ?tempstr="0" & tempstr
?? ??? ?Loop
?? ??? ?c16to2=c16to2 & tempstr
?? ?Next
End Function
'十进制代码转换为二进制代码
Function c10to2(x)
?? ?mysign=Sgn(x)
?? ?x=abs(x)
?? ?DigS=1
?? ?Do
?? ??? ?If x<2^DigS Then
?? ??? ??? ?Exit Do
?? ??? ?Else
?? ??? ??? ?DigS=DigS+1
?? ??? ?End If
?? ?Loop
?? ?tempnum=x
?? ?i=0
?? ?For i=DigS To 1 Step-1
?? ??? ?If tempnum>=2^(i-1) Then
?? ??? ??? ?tempnum=tempnum-2^(i-1)
?? ??? ??? ?c10to2=c10to2 & "1"
?? ??? ?Else
?? ??? ??? ?c10to2=c10to2 & "0"
?? ??? ?End If
?? ?Next
?? ?If mysign=-1 Then c10to2="-" & c10to2
End Function

在正常的utf-8页面下,我们可以直接这样用:

Response.Write UTF2GB("%E6%B1%89%E5%AD%97")

即:UTF2GB("%E6%B1%89%E5%AD%97") = "汉字"

但若当前utf8页面获取到的是一个gb下的编码(如?%BA%BA%D7%D6),该怎么转换成汉字呢?这时候就要用到上面那个URLDecode(enStr)解码函数了,但不能直接用,要特别注意进行临时改变下当前页面的编码模式,应用示例如下:
<%

Session.CodePage = 936 '强制转换到GB2312下
Dim mykey:mykey = URLDecode("%BA%BA%D7%D6") 'GB下的编码字符串
Session.CodePage = 65001 '将页面再次回到utf-8编码下
Response.write(mykey)

%>

这时就获得了汉字了。怎么样,简单吧,下次记得关注本站哦-在远方。