« asp中使用xmlhttp获取远端内容在xmlhttp中传递cookie和表单数据 »

asp中编码的问题和xmlhttp的编码转换

这方面的应该参考蓝色理想的萧萧小雨的文章,其中提到了关于指定codepage的重要性。往往,文本信息的传递实际上通过了一下交换:读者--浏览器--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,只要知道它是干什么的就可以了。

  • Similar.

Comments.

◎ welcome to participate in the discussion

日历

Comments.

Previous.

ADMIN.