如何解决《Request.QueryString和Request.ServerVariables("QUERY_STRING")不显示UNICODE》经验,为你挑选了1个好方法。
我添加日志记录功能,以一个经典的ASP应用程序时遇到困难得到的Request.QueryString和Request.ServerVariables当用户提交UNICODE查询正确显示.
例如 -
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
'-----------------------------------------------------------------------------------------------
bobince..
5
这与Unicode无关.
Request.QueryString
做两件事.
如果您在没有参数的情况下使用它,它将完全按照浏览器提交的方式返回整个查询字符串(如上所述,与QUERY_STRING服务器变量相同).
如果将它与类似的参数一起使用"strVar2"
,它会将查询字符串拆分为参数部分,找到与参数name(strVar2=...
)对应的那个,并返回该值.在这样做时,它负责对查询字符串的组件进行URL解码,包括名称和值,因此%xx
输入中的序列被解码为它们所代表的字节序列:0xE8,0xA1,0x8C,依此类推.当您将该字节字符串打印到浏览器解码为UTF-8的页面时,他们会看到????
.
如果您真的需要,可以在完整的查询字符串上自行执行URL解码步骤.没有一个内置的经典ASP URL解码,但你可以自己写这样的功能(例如见URLDecode
从http://www.aspnut.com/reference/encoding.asp),或使用
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
此处,这就是为什么您应该几乎总是使用该方法来检索参数.
您通过解码整个查询字符串到底想要做什么?
1> bobince..:
这与Unicode无关.
Request.QueryString
做两件事.
如果您在没有参数的情况下使用它,它将完全按照浏览器提交的方式返回整个查询字符串(如上所述,与QUERY_STRING服务器变量相同).
如果将它与类似的参数一起使用"strVar2"
,它会将查询字符串拆分为参数部分,找到与参数name(strVar2=...
)对应的那个,并返回该值.在这样做时,它负责对查询字符串的组件进行URL解码,包括名称和值,因此%xx
输入中的序列被解码为它们所代表的字节序列:0xE8,0xA1,0x8C,依此类推.当您将该字节字符串打印到浏览器解码为UTF-8的页面时,他们会看到????
.
如果您真的需要,可以在完整的查询字符串上自行执行URL解码步骤.没有一个内置的经典ASP URL解码,但你可以自己写这样的功能(例如见URLDecode
从http://www.aspnut.com/reference/encoding.asp),或使用
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
此处,这就是为什么您应该几乎总是使用该方法来检索参数.
您通过解码整个查询字符串到底想要做什么?