软件下载 | 资讯教程 | 最近更新 | 下载排行 | 一键转帖 | 发布投稿
您的位置:最火下载站 > 网络编程 > ASP教程 > xml-rpc 在asp中-中文乱码的解决

xml-rpc 在asp中-中文乱码的解决

【烈火建站学院文档】网上关于xml-rpc的文章的介绍很多,但是出现了问题去找解决的方法没有几个,所以我把几点记下来,以后参考!

1. 先说编码的问题

 当返回中文的时候,总是以这样“????”的方式出现,哪怕是“口口”这样也行啊,毕竟熟悉!

 有一个问题,建立对象(以下提到的都是这两个对象)

以下为引用的内容:
  Set objXML = Server.CreateObject("MSXML2.ServerXMLHTTP")
  Set objLst = Server.CreateObject("MSXML2.DOMDocument")

然后设立 objXML.setRequestHeader "Content-Type", "text/xml"  当然,没有中文的情况下这样的请求是正确的!

如果有中文的话,那么需要编码的处理

view plaincopy to clipboardprint?
Response.CodePage=65001   
response.charset="utf-8"   
UserName=server.urlencode(UserName)  
SYSID=server.urlencode(SYSID)<PRE></PRE> 
 Response.CodePage=65001
 response.charset="utf-8"
 UserName=server.urlencode(UserName)
 SYSID=server.urlencode(SYSID)

当然 ,也可以自己写函数

以下为引用的内容:

view plaincopy to clipboardprint?
Function URLEncoding(vstrIn)  
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 
URLEncoding = strReturn  
End Function 
 
<PRE></PRE> 

Function URLEncoding(vstrIn)
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
URLEncoding = strReturn
End Function

然后就可以发送过去了,要保证发送的地址要对,端口号,验证身份的用户和密码都要对!

接下来就是返回的编码的处理,返回的objXML.ResponseXML(objXML.ResponseXML.xml)里死活没有任何东西,所以这样objXML.responseXML.getElementsByTagName("param")建立节点肯定不会错,但是都是空的!

那么可以这样 objLst.Loadxml(objXML.responseText),因为objXML.responseText里面的东西是正常的,然后再Set objLst = objLst.getElementsByTagName("param"),就没有问题了!

事情出现在gb2312和Unicode之间的战争,出现返回的有中文上述方法失效,我找到http://www.fixdown.com/wz/article/14/17/2006/41692.htm 一看,利用了其中的函数 bytes2BSTR()把问题搞定!看到出来的汉字,欣慰啊!

view plaincopy to clipboardprint?
Function bytes2BSTR(vIn)  
strReturn = "" 
For i = 1 To LenB(vIn)  
ThisCharCode = AscB(MidB(vIn,i,1))  
If ThisCharCode < &H80 Then 
strReturn = strReturn & Chr(ThisCharCode)  
Else 
NextCharCode = AscB(MidB(vIn,i+1,1))  
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))  
i = i + 1  
End If 
Next 
bytes2BSTR = strReturn  
End Function<PRE></PRE> 

Function bytes2BSTR(vIn)
strReturn = ""
For i = 1 To LenB(vIn)
ThisCharCode = AscB(MidB(vIn,i,1))
If ThisCharCode < &H80 Then
strReturn = strReturn & Chr(ThisCharCode)
Else
NextCharCode = AscB(MidB(vIn,i+1,1))
strReturn = strReturn & Chr(CLng(ThisCharCode) * &H100 + CInt(NextCharCode))
i = i + 1
End If
Next
bytes2BSTR = strReturn
End Function是这样使用的,strtem=bytes2BSTR(objXML.responseBody),直接就可以在利用objLst.Loadxml(strtem),建立节点 Set objLst = objLst.getElementsByTagName("param"),没有问题了!

2.我遇到的问题总结

      发送xml出去的时候使用的地址不对,或者是端口不对,或者是多了或者少了“/”什么的,花了我好多时间进行查找原因,因为是对方提供的服务,所以,问题的交流和解决是需要时间的。

      接着就是返回xml的问题,刚开始的时候,objXML.ResponseXML里面不知道有没有东西,因为objXML.ResponseText里面有,所以就认定objXML.ResponseXML也肯定有,所以浪费很多时间进行返回XML节点获取的测试! 后来通过 Set objLst = Server.CreateObject("MSXML2.DOMDocument")  objLst .loadxml(objXML.ResponseText)和objLst .loadxml(objXML.ResponseBody)解决问题。

        接着就是编码的问题,送过去和返回来的中文编码的处理,刚开始返回的是<?xml version="1.0" encoding="gb2312"?>的xml,以后默认的gb2312就可以解决问题,或者是服务器端要解决Response.contentType="text/xml"等解决问题,但是我的情况不是这样,而是通过处理返回的东西进行处理,就是上面所说的通过ResponseBody进行字符转换搞定的!

      还有一个问题是urlencode()的问题,就是因为在url获取参数的话,需要进行URLEncode,因为遇到这种“#”,字符串会自动截取的!

    相关阅读
    网友评论