解码 JavaScript 字符串中包含十六进制的转义序列

IT技术 javascript
2021-03-17 10:23:38

我在 JS 中有一个这种格式的字符串:

http\x3a\x2f\x2fwww.url.com

我怎样才能从中得到解码的字符串?我试过 unescape(), string.decode 但它没有解码这个。如果我在浏览器中显示该编码字符串,它看起来不错 (http://www.url.com),但我想在显示之前操作该字符串。

谢谢。

6个回答

您可以编写自己的替换方法:

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()
完美的!我正在使用 node.js 解码使用这些十六进制转义序列的 nginx 日志。
2021-05-12 10:23:38

这里没有什么可解码的。\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') + '"');

2019年

您可以使用decodeURIdecodeURIComponent而不是unescape

console.log(
  decodeURI('http\x3a\x2f\x2fwww.url.com')
)

var a = 'http\x3a\x2f\x2fwww.url.com'; console.log(a) 打印一个普通的 url.. decodeURI 不适用于这种编码。
2021-04-24 10:23:38