在javascript中解码十六进制字符串

时间:2010-11-17 20:58:57

标签: javascript

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

HTTP \ X3A \ X2F \ x2fwww.url.com

如何从中获取解码后的字符串?我尝试了unescape(),string.decode,但它没有对此进行解码。如果我在浏览器中显示该编码字符串它看起来很好(http://www.url.com),但我想在显示它之前操纵该字符串。

感谢。

7 个答案:

答案 0 :(得分:17)

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

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()

答案 1 :(得分:10)

此处无需解码。 \xNN是JavaScript中的转义字符,表示代码为NN的字符。转义字符只是一种指定字符串的方式 - 解析时,它已被“解码”,这就是它在浏览器中显示的原因。

当你这样做时:

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

它内部存储为http://www.url.com。你可以直接操纵它。

答案 2 :(得分:5)

您无需解码它。你可以安全地操纵它:

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

答案 3 :(得分:2)

如果您已经拥有:

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

答案 4 :(得分:1)

也许这会有所帮助: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 :(得分:1)

2019

您可以使用decodeURIdecodeURIComponent而不是unescape

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

答案 6 :(得分:0)

对于现代Javascript实现,最好使用以下功能之一:

  • decodeURIComponent:及其含义将在URI的某些部分上使用,但仍可用于解码完整的URI。
  • decodeURI:用于解码完整的URI。

两者的有效代码段:

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