我在 JS 中有一个这种格式的字符串:
http\x3a\x2f\x2fwww.url.com
我怎样才能从中得到解码的字符串?我试过 unescape(), string.decode 但它没有解码这个。如果我在浏览器中显示该编码字符串,它看起来不错 (http://www.url.com),但我想在显示之前操作该字符串。
谢谢。
我在 JS 中有一个这种格式的字符串:
http\x3a\x2f\x2fwww.url.com
我怎样才能从中得到解码的字符串?我试过 unescape(), string.decode 但它没有解码这个。如果我在浏览器中显示该编码字符串,它看起来不错 (http://www.url.com),但我想在显示之前操作该字符串。
谢谢。
您可以编写自己的替换方法:
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()
这里没有什么可解码的。\xNN
是 JavaScript 中的转义字符,表示代码为 NN 的字符。转义字符只是指定字符串的一种方式 - 当它被解析时,它已经被“解码”,这就是它在浏览器中显示良好的原因。
当你这样做时:
var str = 'http\x3a\x2f\x2fwww.url.com';
它在内部存储为http://www.url.com
. 您可以直接操作它。
你不需要解码它。您可以按原样安全地操作它:
var str = "http\x3a\x2f\x2fwww.url.com";
alert(str.charAt(4)); // :
alert("\x3a" === ":"); // true
alert(str.slice(0,7)); // http://
如果您已经拥有:
var encodedString = "http\x3a\x2f\x2fwww.url.com";
然后手动解码字符串是不必要的。JavaScript 解释器已经为您解码转义序列,事实上,双重转义会导致您的脚本无法正确处理某些字符串。相反,如果您有:
var encodedString = "http\\x3a\\x2f\\x2fwww.url.com";
这些反斜杠将被视为已转义(因此十六进制转义序列保持未编码),因此请继续阅读。
在这种情况下,最简单的方法是使用该eval
函数,该函数将其参数作为 JavaScript 代码运行并返回结果:
var decodedString = eval('"' + encodedString + '"');
这\x3a
是有效的,因为它是一个有效的 JavaScript 字符串转义码。但是,如果字符串不是来自您的服务器,请不要这样做;如果是这样,您将创建一个新的安全漏洞,因为eval
可用于执行任意 JavaScript 代码。
更好(但不那么简洁)的方法是使用 JavaScript 的字符串替换方法来创建有效的 JSON,然后使用浏览器的 JSON 解析器对结果字符串进行解码:
var decodedString = JSON.parse('"' + encodedString.replace(/([^\\]|^)\\x/g, '$1\\u00') + '"');
// or using jQuery
var decodedString = $.parseJSON('"' + encodedString.replace(/([^\\]|^)\\x/g, '$1\\u00') + '"');
您可以使用decodeURI或decodeURIComponent而不是unescape。
console.log(
decodeURI('http\x3a\x2f\x2fwww.url.com')
)