unicode vbscript asp-classic

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