codepage设置成65001的时候,Asc是取不到汉字的ANSI码的,很多utf-8的开发者都没注意到这个问题,单纯的把codepage设置成65001,用65001编码要改变些观念,在936下的含有Asc的函数都不适应65001的,65001就只能用ChrW
做对照表是个办法,用AscW取Unicode编码,然后找到对应的GB2312编码,需要点内存和检索速度,或者可以用ADODB.Stream这个强大的东东来转换编码
'数字lValue左移iBit位
Public Function LShift(ByVal lValue, ByVal iBit)
LShift = lValue * (2 ^ iBit)
End Function
'整合高低位字节为整数
Public Function MAKEWORD(ByVal iHigh, ByVal iLow)
MAKEWORD = (iHigh And &HFF) Or LShift((iLow And &HFF), 8)
End Function
'将Unicode字符串转换成GBK编码数组
'该函数用于CodePage=65001环境
Public Function UTF8ToANSIArray(ByVal strData)
Dim objStream
Dim ret, i, k
Set objStream = Server.CreateObject("ADODB.Stream")
objStream.Type = 2
objStream.Mode = 3
objStream.Charset = "gbk"
objStream.Open
objStream.WriteText strName
objStream.Position = 0
objStream.Type = 1
ReDim ret(objStream.Size - 1)
For i = 0 To UBound(ret)
ret(i) = AscB(objStream.Read(1))
Next
k = 0
For i = 0 To UBound(ret)
If ret(i) < 128 Then
ret(k) = ret(i)
Else
ret(k) = MAKEWORD(ret(i + 1), ret(i))
i = i + 1
End If
k = k + 1
Next
ReDim Preserve ret(k - 1)
objStream.Close
Set objStream = Nothing
UTF8ToANSIArray = ret
End Function
<%@language="vbscript" codepage="65001"%>
<%
Option Explicit
Response.CharSet = "utf-8"
Dim strName
strName = Request.QueryString("name")
If Not IsEmpty(strName) Then
Response.Write Request.ServerVariables("QUERY_STRING") & "<br/>"
Response.Write strName & "<br/>"
Response.Write Chr(&HD5C5) & "<br/>"
Response.Write Join(UTF8ToANSIArray(strName), ",")
End If
'把上面提供的函数加入到这里来
%>
<form action="test.asp" method="get">
<input name="name" type="text" />
<input type="submit" />
</form>
但这还是舍本求末的方法,因为动用了组件,远没有Asc快