热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《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此处,这就是为什么您应该几乎总是使用该方法来检索参数.

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


推荐阅读
author-avatar
桦7231227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有