在UTF-8页中接收和使用以GB2312方式进行URL编码的中文数据

  本文记录我如何在UTF-8页中接收和使用以GB2312方式进行URL编码的中文数据的实现。

  比如“汉”字:
  以GB2312编码进行URLEncode后:%BA%BA
  以UTF-8编码进行URLEncode后:%E6%B1%89

  如果将以GB2312编码进行URLEncode后的数据%BA%BA直接通过URL传递给UTF-8编码的网页,并在网页中直接以Request.QueryString方式读取数据,就会有乱码问题。

  解决方法如下:

功能代码
   
     
' 说明:在UTF-8编码网页中读取以GB2312方式编码的URLEncode数据
'
使用:sTest = GBQueryString("Test")
Function GBQueryString(ByVal sQueryName)
Dim iCodePage, sQueryValue

iCodePage
= Session.CodePage
Session.CodePage
= 936
sQueryValue
= Request.QueryString(sQueryName)
Session.CodePage
= iCodePage

GBQueryString
= URLDecode(GBToUTF8(sQueryValue))
End Function

Function GBToUTF8(sInput)
Dim wChar, uChar, nAsc, sResult, i

' 如果输入参数为空,则退出函数
If sInput = "" Then
GBToUTF8
= sInput
Exit Function
End If
' 开始转换
For i = 1 To Len (sInput)
' 利用mid函数分拆GB编码文字
wChar = Mid (sInput, i, 1 )
' 利用ascW函数返回每一个GB编码文字的Unicode字符代码
' 注:asc函数返回的是ANSI 字符代码,注意区别
nAsc = AscW(wChar)
If nAsc < 0 Then nAsc = nAsc + 65536

If (nAsc And & HFF80) = 0 Then
sResult
= sResult & wChar
Else
If (nAsc And & HF000) = 0 Then
uChar
= " % " & Hex (((nAsc \ 2 ^ 6 )) Or & HC0) & _
Hex (nAsc And & H3F Or & H80)
sResult
= sResult & uChar
Else
' GB编码文字的Unicode字符代码在0800 - FFFF之间采用三字节模版
uChar = " % " & Hex ((nAsc \ 2 ^ 12 ) Or & HE0) & _
" % " & Hex ((nAsc \ 2 ^ 6 ) And & H3F Or & H80) & _
" % " & Hex (nAsc And & H3F Or & H80)
sResult
= sResult & uChar
End If
End If
Next

GBToUTF8
= sResult
End Function

Function URLDecode(enStr)
Dim deStr, sSpecial, c, i, v

deStr
= ""
sSpecial
= " !""#$%&'()*+,.-_/:;<=>?@[\]^`{|}~% "
For i = 1 To Len (enStr)
c
= Mid (enStr, i, 1 )
If c = " % " Then
v
= Eval ( " &h " + Mid (enStr, i + 1 , 2 ))
If InStr (sSpecial, 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
使用实例
   
     
Dim sTest
sTest = GBQueryString( " Test " ) ' 取得URL传过来的名为Test的参数的内容
Response.Write(sTest) ' 输出Test的内容到页面上

你可能感兴趣的:(utf-8)