广

ASP编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-03 22:13:03 次阅读 稿源:互联网
    零七广告
    【烈火建站学院文档】网上关于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,因为遇到这种“#”,字符串会自动截取的!

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告