繁体   English   中英

Request.QueryString和Request.ServerVariables(“QUERY_STRING”)不显示UNICODE

[英]Request.QueryString And Request.ServerVariables(“QUERY_STRING”) Not Displaying UNICODE

我正在向经典ASP应用程序添加日志记录功能,并且在用户提交UNICODE查询时难以正确显示Request.QueryString和Request.ServerVariables。

例如 -

Response.write Request.QueryString
strVar1=&strVar2=%E8%A1%8C%E9%9B%B2%E6%B5%81%E6%B0%B4&strVar3=blah1&strVar4=blah2


Response.write Request.ServerVariables("QUERY_STRING")
strVar1=&strVar2=%E8%A1%8C%E9%9B%B2%E6%B5%81%E6%B0%B4&strVar3=blah1&strVar4=blah2


然而,如果我在Request.QueryString中指定一个UNICODE变量,它会正确打印:

Response.write Request.QueryString("strVar2")
行雲流水


如何获取Request.QueryString或Request.ServerVariables(“QUERY_STRING”)以包含UNICODE? 我在搜索和结果页面上都有以下内容,并且查询对数据库成功执行:

<%
Response.CodePage = 65001
Response.CharSet = "utf-8"
%>

要回答bobince的问题,我正在尝试记录他们提交的搜索条件和页面 - 如果有更好的方法可以做到这一点,我会全力以赴:

'Enable Logging: writes to MyDB.dbo.logging
'---------------------------------------------------------------------------------------------
Set cmd = Server.CreateObject("ADODB.Command")
cmd.CommandType = adCmdText
cmd.ActiveConnection = objConn

strADName = UCase(Request.ServerVariables("AUTH_USER"))

Protocol = Request.ServerVariables("SERVER_PROTOCOL")
Protocol = Left(Protocol,InStr(Request.ServerVariables("SERVER_PROTOCOL"),"/")-1)

if Request.ServerVariables("SERVER_PORT") = "80" then
port = ""
else
port = ":" & Request.ServerVariables("SERVER_PORT")
end if

CurPageURL = lcase(Protocol) & "://" & Request.ServerVariables("SERVER_NAME") &_
          port & Request.ServerVariables("SCRIPT_NAME") & "?" & _
          Request.ServerVariables("QUERY_STRING")

strSQL = "INSERT INTO MyDB.dbo.Logging([user],URL) SELECT ?, ? "
cmd.Parameters.Append (cmd.CreateParameter("User", adVarWChar, adParamInput, len(strADName),    strADName))
cmd.Parameters.Append (cmd.CreateParameter("URL", adVarWChar, adParamInput, len(CurPageURL), CurPageURL))

cmd.CommandText = strSQL
set objRS = cmd.Execute
'-----------------------------------------------------------------------------------------------

这与Unicode无关。

Request.QueryString做了两件事。

如果您在没有参数的情况下使用它,它将完全按照浏览器提交的方式返回整个查询字符串(如上所述,与QUERY_STRING服务器变量相同)。

如果将它与"strVar2"类的参数一起使用,它会将查询字符串拆分为参数部分,找到与参数名称对应的一个( strVar2=... ),然后返回该值。 在这样做时,它负责对查询字符串的组件进行URL解码,包括名称和值,因此输入中的%xx序列被解码为它们所代表的字节序列:0xE8,0xA1,0x8C,依此类推。 当您将该字节字符串打印到浏览器解码为UTF-8的页面时,他们将看到行雲流水

如果您真的需要,可以在完整的查询字符串上自行执行URL解码步骤。 在Classic ASP中没有用于URL解码的内置功能,但您可以自己编写这样的功能(参见例如来自http://www.aspnut.com/reference/encoding.asp的 URLDecode ),或者使用

decodeURIComponent(s.replace(/\+/g, ' '))

来自JScript。

请注意,如果您将整个URL字符串进行URL解码,则可能会破坏它。 例如,输入查询字符串:

foo=abc%26def&bar=%e6%97%a5%e6%9c%ac%e8%aa%9e

你会得到:

foo=abc&def&bar=日本語

这对日本人来说很好,但是foo值的&符号已经破坏了整个字符串,所以你不能再确定原始参数是什么了。 一般情况下,一旦将URL组件从它们所引入的URL中分离出来,通常只能解码它们。这就是ASP为你做的事情: Request.QueryString("foo")会在这里正确地返回abc&def这就是为什么你应该几乎总是在使用它检索参数的方法。

您通过解码整个查询字符串到底想要做什么?

如果这可以帮助别人:

我通过使用带有&作为分隔符的split函数从QUERY_STRING中提取变量名来解决此问题。 然后我使用Request.QueryString的变量来获取值,包括具有UNICODE的值。 这是有效的,除非用户在查询中包含&,这将是非常罕见的。 我确实陷阱,所以至少在这种情况下我仍然可以看到日志中访问的用户和页面。 Bobince你的反应很好,我会选择它作为答案。

'Enable Logging: writes to MyDB.dbo.logging
'---------------------------------------------------------------------------------------------
Set cmd = Server.CreateObject("ADODB.Command")
    cmd.CommandType = adCmdText
    cmd.ActiveConnection = objConn
    cmd.CommandTimeOut = 1200

strADName = UCase(Request.ServerVariables("AUTH_USER"))

Protocol = Request.ServerVariables("SERVER_PROTOCOL")
Protocol = Left(Protocol,InStr(Request.ServerVariables("SERVER_PROTOCOL"),"/")-1)

if Request.ServerVariables("SERVER_PORT") = "80" then
   port = ""
else
   port = ":" & Request.ServerVariables("SERVER_PORT")
end if 

CurPageURL = lcase(Protocol) & "://" & Request.ServerVariables("SERVER_NAME") &_
          port & Request.ServerVariables("SCRIPT_NAME") & "?"

On Error Resume Next
a = Request.ServerVariables("QUERY_STRING")
a = split(a,"&")
for each x in a
'response.write(left(x,InStr(x,"=")-1) & "<br />")
CurPageURL = CurPageURL + left(x,InStr(x,"=")-1) + "=" + Request.QueryString(left(x,InStr(x,"=")-1)) & "&"
next

If Err.Number <> 0 Then
    CurPageURL = CurPageURL + "Error: Search Term Contained a &"
    Err.Clear
Else
    CurPageURL = left(CurPageURL,len(CurPageURL)-1)
End If

strSQL = "INSERT INTO MyDB.dbo.Logging([user],URL) SELECT ?, ? "
cmd.Parameters.Append (cmd.CreateParameter("User", adVarWChar, adParamInput, len(strADName), strADName))
cmd.Parameters.Append (cmd.CreateParameter("URL", adVarWChar, adParamInput, len(CurPageURL), CurPageURL))

cmd.CommandText = strSQL
set objRS = cmd.Execute

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM