utf 8 - Decodificación de cadenas URL codificadas UTF-8 en VBScript
urldecode (3)
Quiero mostrar tres métodos para tres entornos diferentes. Todos estos métodos requieren las funciones encodeURIComponent
y decodeURIComponent
JScript.
1. En ASP, usar JavaScript en el lado del servidor es una de las soluciones más adecuadas:
<script language="javascript" runat="server">
URL = {
encode : function(s){return encodeURIComponent(s).replace(/''/g,"%27").replace(/"/g,"%22")},
decode : function(s){return decodeURIComponent(s.replace(//+/g, " "))}
}
</script>
<%
Response.Write URL.decode("Paris%20%E2%86%92%20Z%C3%BCrich")
Response.Write URL.encode("Paris → Zürich")
%>
2. Sólo 32 bits ( debido a MSScriptControl.ScriptControl es un componente de 32 bits solamente ) en cualquier otro WSH:
Dim JSEngine
Set JSEngine = CreateObject("MSScriptControl.ScriptControl")
JSEngine.Language = "JScript"
Function UrlEncode(s)
UrlEncode = JSEngine.CodeObject.encodeURIComponent(s)
UrlEncode = Replace(UrlEncode, "''", "%27")
UrlEncode = Replace(UrlEncode, """", "%22")
End Function
Function UrlDecode(s)
UrlDecode = Replace(s, "+", " ")
UrlDecode = JSEngine.CodeObject.decodeURIComponent(UrlDecode)
End Function
WScript.Echo UrlDecode("Paris%20%E2%86%92%20Z%C3%BCrich")
WScript.Echo UrlEncode("Paris → Zürich")
3. Con soporte de 64 bits en cualquier otro WSH que use un WSC:
urlencdec.wsc (creado al usar el Asistente de WSC )
<?xml version="1.0"?>
<component>
<?component error="true" debug="true"?>
<registration
description="Url Encode / Decode Helper"
progid="JSEngine.Url"
version="1.0"
classid="{80246bcc-45d4-4e92-95dc-4fd9a93d8529}"
/>
<public>
<method name="encode">
<PARAMETER name="s"/>
</method>
<method name="decode">
<PARAMETER name="s"/>
</method>
</public>
<script language="JScript">
<![CDATA[
var description = new UrlEncodeDecodeHelper;
function UrlEncodeDecodeHelper() {
this.encode = encode;
this.decode = decode;
}
function encode(s) {
return encodeURIComponent(s).replace(/''/g,"%27").replace(/"/g,"%22");
}
function decode(s) {
return decodeURIComponent(s.replace(//+/g, " "));
}
]]>
</script>
</component>
y código vbs:
Dim JSEngine
Set JSEngine = GetObject("Script:C:/urlencdec.wsc")
WScript.Echo JSEngine.decode("Paris%20%E2%86%92%20Z%C3%BCrich")
WScript.Echo JSEngine.encode("Paris → Zürich")
Necesito URL decodificar una cadena en un VBScript. La cadena puede contener caracteres Unicode que están codificados como bytes múltiples según UTF-8. Entonces, por ejemplo, "Paris% 20% E2% 86% 92% 20Z% C3% BCrich" decodificaría a "Paris → Zürich".
Para hacer el trabajo, estoy usando un código que se ve así:
Function URLDecode(str)
set list = CreateObject("System.Collections.ArrayList")
strLen = Len(str)
for i = 1 to strLen
sT = mid(str, i, 1)
if sT = "%" then
if i + 2 <= strLen then
list.Add cbyte("&H" & mid(str, i + 1, 2))
i = i + 2
end if
else
list.Add asc(sT)
end if
next
depth = 0
for each by in list.ToArray()
if by and &h80 then
if (by and &h40) = 0 then
if depth = 0 then Err.Raise 5
val = val * 2 ^ 6 + (by and &h3f)
depth = depth - 1
if depth = 0 then
sR = sR & chrw(val)
val = 0
end if
elseif (by and &h20) = 0 then
if depth > 0 then Err.Raise 5
val = by and &h1f
depth = 1
elseif (by and &h10) = 0 then
if depth > 0 then Err.Raise 5
val = by and &h0f
depth = 2
else
Err.Raise 5
end if
else
if depth > 0 then Err.Raise 5
sR = sR & chrw(by)
end if
next
if depth > 0 then Err.Raise 5
URLDecode = sR
End Function
Esto parece estar funcionando bien, pero parece exageradamente complejo para mí. En tiempos de HTML5 y estándares web, debe haber una forma más sencilla de hacerlo sin un montón de bucles y condiciones hechos a mano. ¿Alguna sugerencia?
La mejor forma de codificar una URL usando VBS es usar la función de codificación encodeURIComponent () javascript !! El componente ScriptControl le permite ejecutar código js desde un entorno VBS.
Aquí está mi función URLEncode, que funciona exactamente igual que la función js (¡de hecho, la llama!):
Function URLEncode(str) Dim encodedUrl Set sc = CreateObject("MSScriptControl.ScriptControl") sc.Language = "JScript" sc.AddCode "var s = """ & str & """;" sc.AddCode "function myEncode(s){return encodeURIComponent(s);}" urlCodificada = sc.Eval("myEncode(s);") Set sc = Nothing URLEncode = encodedUrl End Function
Pure vbs classic asp de la función URLDecode , con soporte para utf-8.
<%
Function RegExTest(str,patrn)
Dim regEx
Set regEx = New RegExp
regEx.IgnoreCase = True
regEx.Pattern = patrn
RegExTest = regEx.Test(str)
End Function
Function URLDecode(sStr)
Dim str,code,a0
str=""
code=sStr
code=Replace(code,"+"," ")
While len(code)>0
If InStr(code,"%")>0 Then
str = str & Mid(code,1,InStr(code,"%")-1)
code = Mid(code,InStr(code,"%"))
a0 = UCase(Mid(code,2,1))
If a0="U" And RegExTest(code,"^%u[0-9A-F]{4}") Then
str = str & ChrW((Int("&H" & Mid(code,3,4))))
code = Mid(code,7)
ElseIf a0="E" And RegExTest(code,"^(%[0-9A-F]{2}){3}") Then
str = str & ChrW((Int("&H" & Mid(code,2,2)) And 15) * 4096 + (Int("&H" & Mid(code,5,2)) And 63) * 64 + (Int("&H" & Mid(code,8,2)) And 63))
code = Mid(code,10)
ElseIf a0>="C" And a0<="D" And RegExTest(code,"^(%[0-9A-F]{2}){2}") Then
str = str & ChrW((Int("&H" & Mid(code,2,2)) And 3) * 64 + (Int("&H" & Mid(code,5,2)) And 63))
code = Mid(code,7)
ElseIf (a0<="B" Or a0="F") And RegExTest(code,"^%[0-9A-F]{2}") Then
str = str & Chr(Int("&H" & Mid(code,2,2)))
code = Mid(code,4)
Else
str = str & "%"
code = Mid(code,2)
End If
Else
str = str & code
code = ""
End If
Wend
URLDecode = str
End Function
Response.Write URLDecode("Paris%20%E2%86%92%20Z%C3%BCrich") ''Paris → Zürich
%>