Request.QueryString And Request.ServerVariables("QUERY_STRING") No muestra UNICODE
vbscript asp-classic (2)
Estoy agregando funcionalidad de registro a una aplicación ASP clásica y estoy teniendo dificultades para que Request.QueryString y Request.ServerVariables se muestren correctamente cuando los usuarios envían consultas UNICODE.
Por ejemplo -
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
Sin embargo, si especifico una variable UNICODE en Request.QueryString, se imprime correctamente:
Response.write Request.QueryString("strVar2")
行雲流水
¿Cómo puedo obtener Request.QueryString o Request.ServerVariables ("QUERY_STRING") para incluir UNICODE? Tengo lo siguiente en mis páginas de búsqueda y resultados y las consultas se ejecutan correctamente en la base de datos:
<%
Response.CodePage = 65001
Response.CharSet = "utf-8"
%>
Para responder a la pregunta de Bobince, intento registrar los términos de búsqueda y las páginas desde las cuales se enviaron; si hay una forma mejor de hacerlo, soy todo oídos:
''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
''-----------------------------------------------------------------------------------------------
Esto no tiene nada que ver con Unicode.
Request.QueryString
hace dos cosas por separado.
Si lo usa sin argumentos, devuelve toda la cadena de consulta exactamente como lo envió el navegador (como se indicó anteriormente, al igual que la variable de servidor QUERY_STRING).
Si lo usa con un argumento como "strVar2"
, divide la cadena de consulta en partes de parámetros, encuentra la (s) correspondiente (s) al nombre del argumento ( strVar2=...
) y devuelve el valor. Al hacerlo, se ocupa de la decodificación URL de los componentes de la cadena de consulta, incluido el nombre y el valor, de modo que las secuencias %xx
en la entrada se decodifican a la secuencia de bytes que representan: 0xE8, 0xA1, 0x8C, etc. Cuando imprime esa cadena de bytes en una página que un navegador decodifica como UTF-8, verá 行雲流水
.
Puede hacer un paso de descodificación URL usted mismo en la cadena de consulta completa si realmente lo desea. No hay una función incorporada para la decodificación de URL en la ASP clásica, pero usted mismo puede escribir dicha función (consulte, por ejemplo, URLDecode
en http://www.aspnut.com/reference/encoding.asp ), o use
decodeURIComponent(s.replace(//+/g, '' ''))
de JScript.
Tenga en cuenta que si decodifica URL una cadena de URL completa, estará rompiéndola. Por ejemplo, para cadena de consulta de entrada:
foo=abc%26def&bar=%e6%97%a5%e6%9c%ac%e8%aa%9e
obtendrías:
foo=abc&def&bar=日本語
lo cual está bien para los japoneses, pero el ampersand en el valor para foo
ha roto toda la cadena por lo que ya no se puede decir con certeza cuáles fueron los parámetros originales. Por lo general, solo debe decodificar los componentes de URL una vez que los haya dividido de la URL en la que ingresaron. Esto es lo que ASP hace por usted: Request.QueryString("foo")
devolverá abc&def
correctamente, razón por la cual casi siempre debería estar usando ese método para recuperar parámetros.
¿Qué estás tratando de hacer exactamente decodificando una cadena de consulta completa?
En caso de que esto pueda ayudar a alguien más:
Resolví esto extrayendo nombres de variables de QUERY_STRING usando la función de división con & como el delimitador. Luego usé las variables con Request.QueryString para obtener los valores, incluidos los que tienen UNICODE. Esto funciona a menos que el usuario incluya & en la consulta, lo que será bastante raro. Lo atrapo, así que al menos en ese caso aún puedo ver al usuario y la página a la que se accede en los registros. Bobince tu respuesta fue excelente y la seleccionaré como respuesta.
''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