Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解码JavaScript字符串中包含转义序列的十六进制_Javascript - Fatal编程技术网

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

解码JavaScript字符串中包含转义序列的十六进制,javascript,Javascript,我有一个JS格式的字符串: http\x3a\x2f\x2fwww.url.com 我怎样才能从中得到解码的字符串?我尝试了unescape(),string.decode,但它无法对其进行解码。如果我在浏览器中显示该编码字符串,它看起来很好(http://www.url.com),但我想在显示此字符串之前对其进行操作 谢谢。如果您已经: var encodedString = "http\x3a\x2f\x2fwww.url.com"; 然后,手动解码字符串是不必要的。JavaScript解

我有一个JS格式的字符串:

http\x3a\x2f\x2fwww.url.com

我怎样才能从中得到解码的字符串?我尝试了unescape(),string.decode,但它无法对其进行解码。如果我在浏览器中显示该编码字符串,它看起来很好(http://www.url.com),但我想在显示此字符串之前对其进行操作

谢谢。

如果您已经:

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') + '"');

这里没有什么可解码的
\xNN
是JavaScript中的转义字符,表示代码为NN的字符。转义字符只是一种指定字符串的方式——当它被解析时,它已经被“解码”,这就是为什么它在浏览器中显示良好

当您这样做时:

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

它在内部存储为
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()
也许这有助于:


你不需要破译它。您可以按原样安全地操作它:

var str = "http\x3a\x2f\x2fwww.url.com";
​alert(str.charAt(4));  // :
alert("\x3a" === ":"); // true
alert(str.slice(0,7))​; // http://
2019 你可以用也可以不用

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

)
对于现代Javascript实现,最好使用以下函数之一:

  • :及其intedend可用于部分URI,但仍可用于解码完整URI
  • :用于解码完整URI
这两个方面的工作代码段:

consturiencoded='http\x3a\x2f\x2fwww.url.com'
log('decodeURIComponent:',decodeURIComponent(uriEncoded));

log('decodeURI:',decodeURI(uriEncoded))完美!我使用node.js对使用这些十六进制转义序列的nginx日志进行解码。var a='http\x3a\x2f\x2fwwww.url.com';日志(a)打印一个正常的url。。decodeURI不适用于此编码。
var str = "http\x3a\x2f\x2fwww.url.com";
​alert(str.charAt(4));  // :
alert("\x3a" === ":"); // true
alert(str.slice(0,7))​; // http://