xmlhttp的编码转换

往往,文本信息的传递实际上通过了一下交换:读者--浏览器--web服务器--数据库服务器;后面的三者不一定都是采用utf-8编码的,特别是当传递汉字的时候。
下面一行可以指定给浏览器文档的编码:
meta http-equiv="Content-Type" content="text/html; charset=utf-8"
浏览器会根据meta值选择编码,它负责读者和浏览器的交互,浏览者可以强制改变编码方式;
同时在asp文件首行可以通过以下命令指定处理字符时候采用的编码:
@ codepage=936 简体中文
@ codepage=950 繁体中文
@ codepage=65001 UTF-8
为了避免乱码产生,最好和数据库以及html信息中指定的编码一致。
在mssql、mysql等数据库中,也含有编码的信息。

ServerXMLHTTP默认的CodePage是UTF8,URL和文件信息被先转换为UTF8编码,如果使用responseText属性,即xmlhttp通过http请求得到的返回的文本信息,如果不采用gb2312编码,即使所有编码一致,汉字也将无法正常显示(测试发现),所以一般使用responseBody,既返回文档的未经过解码的二进制信息,然后在经过编码转换来正确显示汉字。

下面是一个流传广泛的Function:

Function BytesToBstr(body,Cset)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = Cset
BytesToBstr = objstream.ReadText
objstream.Close
set objstream = nothing
End Function

Cset参数是指定的编码,例如gb2312,big5,utf-8等,body参数是xmlhttp返回的responseBody :回应信息正文unsigned byte数组形式.

现在来看看cnbruce的代码(超级提示:所有内容必须在百分号内部才可以运行):

Function getHTTPPage(url)
dim objXML
set objXML=server.createobject("MSXML2.XMLHTTP")'定义
objXML.open "GET",url,false'打开
objXML.send()'发送
If objXML.readystate<>4 then '判断文档是否已经解析完,以做客户端接受返回消息
exit function
End If
getHTTPPage=BytesToBstr(objXML.responseBody)'返回信息,同时用函数定义编码
set objXML=nothing'关闭
if err.number<>0 then err.Clear 
End Function

Function BytesToBstr(body)
dim objstream
set objstream = Server.CreateObject("adodb.stream")
objstream.Type = 1
objstream.Mode =3
objstream.Open
objstream.Write body
objstream.Position = 0
objstream.Type = 2
objstream.Charset = "GB2312" 
'转换原来默认的UTF-8编码转换成GB2312编码,否则直接用XMLHTTP调用有中文字符的网页得到的将是乱码
BytesToBstr = objstream.ReadText 
objstream.Close
set objstream = nothing
End Function

Dim Url,Html
Url = " http://www.cnbruce.com/blog"
Html = getHTTPPage(Url)
response.write(Html)

很简洁的说明了问题。

最后,附一个将汉字转化为google搜索结果中编码方式的程序:

Function AnsiCode(vstrIn)
Dim i, strReturn, innerCode, ThisChr
Dim Hight8, Low8
strReturn = "" 
For i = 1 To Len(vstrIn) 
ThisChr = Mid(vStrIn,i,1) 
If Abs(Asc(ThisChr)) < &HFF Then 
strReturn = strReturn & ThisChr 
Else
innerCode = Asc(ThisChr)
If innerCode < 0 Then
innerCode = innerCode + &H10000
End If
Hight8 = (innerCode And &HFF00) / &HFF
Low8 = innerCode And &HFF
strReturn = strReturn & "%" & Hex(Hight8) & "%" & Hex(Low8)
End If 
Next 
AnsiCode = strReturn 
End Function

所有的代码都是copy的,而且早被抄来抄去,需要了解更多信息,把函数名google一下就知道了。
其中的原理不知道,可以看看计算机三级教材中关于汉字内码、机器码、国标码的转换问题,也许会有点关系,也许又没有关系:这么困难的东西,懂汇编的或者用c++和java的人应该比较了解,象我这样vbscript都每次需要查手册的好孩子,把函数记下来就可以了:比如那个md5.asp,只要知道它是干什么的就可以了。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值