2012-02-22 22 views
0

此问题遵循an earlier one用意外的URL编码解析POST请求

下面是一些代码能重现问题:

POST:

str = "accountRequest=<NewUser>" & vbLf & _ 
"Hello" & vbTab & "World" & vbLf & _ 
"</NewUser>" 


Set objHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0") 
objHTTP.open "POST", "service.asp", False 
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 
objHTTP.send str 

response.Write(objHTTP.responseText) 

Set objHTTP = Nothing 

service.asp:

function w (str) 
response.Write(str & "<br>") 
end function 

str = request.Form("accountRequest") 

w(str) 
w("Tabs: "& InStr(str,vbTab)) 
w("Lines: "& InStr(str,vbLf)) 

输出:

HelloWorld 
Tabs: 0 
Lines: 0 

任何人都可以请帮助?

+0

您是否从Windows机器发布到Linux机器? – 2012-02-23 06:38:30

+0

它似乎是一台Linux机器的Windows机器 – greener 2012-02-23 08:33:58

回答

0

终于想通了,如果他们在“\ t”的格式ASP Request.Form方法不保存选项卡(而不是URL编码)。但是,PHP的$_POST呢。

0

尝试:

Replace(Request.Form("accountRequest"), vbLF, vbCRLF)) 

或者:

Replace(Request.Form("accountRequest"), vbLF, "<br>"))| 

取决于你在哪里显示它,要么应该工作。

或者可能是这样的:

Function URLDecode(sConvert) 
    Dim aSplit 
    Dim sOutput 
    Dim I 
    If IsNull(sConvert) Then 
    URLDecode = "" 
    Exit Function 
    End If 

    ' convert all pluses to spaces 
    sOutput = REPLACE(sConvert, "+", " ") 

    ' next convert %hexdigits to the character 
    aSplit = Split(sOutput, "%") 

    If IsArray(aSplit) Then 
    sOutput = aSplit(0) 
    For I = 0 to UBound(aSplit) - 1 
     sOutput = sOutput & _ 
     Chr("&H" & Left(aSplit(i + 1), 2)) &_ 
     Right(aSplit(i + 1), Len(aSplit(i + 1)) - 2) 
    Next 
    End If 

    URLDecode = sOutput 
End Function 

从这里:http://www.aspnut.com/reference/encoding.asp

如果他们跨线来作为实际的“\”和“n”的字符,你可以做这些字符替换用适当的vbCRLF和vbTAB常量。

+0

谢谢,但我恐怕没有这样做。我仍然得到: ' userNamepasswordfNamelNameABC123wzbtw88gJoeBloggs' 就好像它不承认换行或制表符... – greener 2012-02-24 10:24:04

+0

刚一看来,作为ASP/VB使用请求方法处理POST时,换行符和制表符被逃脱。 – greener 2012-02-24 11:18:09

+0

嗨绿色,我更新了我的答案。你可以使用它来解码URL字符串? – 2012-02-24 17:33:40