2010-11-17 50 views
5

que tiene una cadena de JS en este formato:decodificación cadena hexadecimal en javascript

http \ X3A \ x2f \ x2fwww.url.com

¿Cómo puedo obtener la cadena decodificada de esto? Intenté unescape(), string.decode pero no decodifica esto. Si visualizo esa cadena codificada en el navegador se ve bien (http://www.url.com), pero quiero manipular esta cadena antes de mostrarla.

Gracias.

Respuesta

11

Se puede escribir su propio método de sustitución:

String.prototype.decodeEscapeSequence = function() { 
    return this.replace(/\\x([0-9A-Fa-f]{2})/g, function() { 
     return String.fromCharCode(parseInt(arguments[1], 16)); 
    }); 
}; 
"http\\x3a\\x2f\\x2fwww.example.com".decodeEscapeSequence() 
+0

perfecto! Estaba usando node.js para decodificar registros nginx que usan estas secuencias de escape hexagonal. –

1

Si ya tiene:

var encodedString = "http\x3a\x2f\x2fwww.url.com"; 

Entonces al descodificar la cadena manual es innecesaria. El intérprete de JavaScript ya estaría decodificando las secuencias de escape para usted, y de hecho, el doble desencolado puede hacer que su secuencia de comandos no funcione correctamente con algunas cadenas. Si, por el contrario, tiene:

var encodedString = "http\\x3a\\x2f\\x2fwww.url.com"; 

Esas barras invertidas serían considerados escaparon (por lo tanto, las secuencias de escape hexagonal permanecen sin codificar), así que sigue leyendo.

La manera más fácil en ese caso es utilizar la función de eval, que se extiende su argumento como código JavaScript y devuelve el resultado:

var decodedString = eval('"' + encodedString + '"'); 

Esto funciona porque \x3a es un código de escape de cadenas válidas JavaScript. Sin embargo, no lo haga de esta manera si la cadena no proviene de su servidor; de ser así, estarías creando una nueva debilidad de seguridad porque eval se puede usar para ejecutar código JavaScript arbitrario.

Un mejor enfoque (pero menos concisa) sería el uso de la cadena de JavaScript reemplazar método para crear JSON válido, entonces usar JSON analizador del navegador para decodificar la cadena resultante:

var decodedString = JSON.parse('"' + encodedString.replace(/([^\\]|^)\\x/g, '$1\\u00') + '"'); 

// or using jQuery 
var decodedString = $.parseJSON('"' + encodedString.replace(/([^\\]|^)\\x/g, '$1\\u00') + '"'); 
10

No hay nada que descifrar aquí. \xNN es un carácter de escape en JavaScript que denota el carácter con el código NN. Un carácter de escape es simplemente una forma de especificar una cadena: cuando se analiza, ya está "decodificada", por lo que se muestra bien en el navegador.

Al hacer:

var str = 'http\x3a\x2f\x2fwww.url.com'; 

se almacena internamente como http://www.url.com. Puedes manipular esto directamente.

1

tal vez esto ayuda: http://cass-hacks.com/articles/code/js_url_encode_decode/

function URLDecode (encodedString) { 
var output = encodedString; 
var binVal, thisString; 
var myregexp = /(%[^%]{2})/; 
while ((match = myregexp.exec(output)) != null 
      && match.length > 1 
     && match[1] != '') { 
binVal = parseInt(match[1].substr(1),16); 
thisString = String.fromCharCode(binVal); 
output = output.replace(match[1], thisString); 
} 
return output; 
} 
5

No es necesario para decodificarlo. Puede manipularlo de forma segura tal como está:

var str = "http\x3a\x2f\x2fwww.url.com"; 
​alert(str.charAt(4)); // : 
alert("\x3a" === ":"); // true 
alert(str.slice(0,7))​; // http:// 
Cuestiones relacionadas