Dekodieren von Hex-enthaltenden Escape-Sequenzen in JavaScript-Strings

Lesezeit: 3 Minuten

Dekodieren von Hex enthaltenden Escape Sequenzen in JavaScript Strings
Siger

Ich habe eine Zeichenfolge in JS in diesem Format:

http\x3a\x2f\x2fwww.url.com

Wie bekomme ich die decodierte Zeichenfolge daraus? Ich habe unescape(), string.decode ausprobiert, aber es dekodiert dies nicht. Wenn ich diese codierte Zeichenfolge im Browser anzeige, sieht sie gut aus (http://www.url.com), aber ich möchte diese Zeichenfolge bearbeiten, bevor ich sie zeige.

Danke.

Sie könnten Ihre eigene Ersetzungsmethode schreiben:

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

  • perfekt! Ich habe node.js verwendet, um Nginx-Protokolle zu decodieren, die diese Hex-Escape-Sequenzen verwenden.

    – Michael Connor

    12. August 2015 um 20:33 Uhr

Hier gibt es nichts zu entschlüsseln. \xNN ist ein Escape-Zeichen in JavaScript, das das Zeichen mit dem Code NN bezeichnet. Ein Escape-Zeichen ist einfach eine Möglichkeit, eine Zeichenfolge anzugeben – wenn es geparst wird, ist es bereits “dekodiert”, weshalb es im Browser gut angezeigt wird.

Wenn Sie das tun:

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

es wird intern gespeichert als http://www.url.com. Sie können dies direkt manipulieren.

1647169505 464 Dekodieren von Hex enthaltenden Escape Sequenzen in JavaScript Strings
Bitte stehen

Wenn Sie bereits haben:

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

Dann Das manuelle Decodieren der Zeichenfolge ist nicht erforderlich. Der JavaScript-Interpreter würde die Escape-Sequenzen bereits für Sie dekodieren, und tatsächlich kann doppeltes Aufheben der Escape-Zeichen dazu führen, dass Ihr Skript mit einigen Zeichenfolgen nicht richtig funktioniert. Wenn Sie dagegen:

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

Diese Backslashes würden als Escapezeichen betrachtet (daher bleiben die Hex-Escape-Sequenzen uncodiert), also lesen Sie weiter.

Der einfachste Weg in diesem Fall ist die Verwendung von eval Funktion, die ihr Argument als JavaScript-Code ausführt und das Ergebnis zurückgibt:

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

Das funktioniert, weil \x3a ist ein gültiger JavaScript-String-Escape-Code. Tun Sie es jedoch nicht auf diese Weise wenn der String nicht von Ihrem Server kommt; Wenn ja, würden Sie eine neue Sicherheitslücke schaffen, weil eval kann verwendet werden, um beliebigen JavaScript-Code auszuführen.

Ein besserer (aber weniger prägnanter) Ansatz wäre dann die Verwendung der String-Replace-Methode von JavaScript, um gültiges JSON zu erstellen Verwenden Sie den JSON-Parser des Browsers um die resultierende Zeichenfolge zu decodieren:

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

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

  • Dagegen habe ich nur einen kleinen Einwand. Es ist nur ein kleiner Grenzfall. Am Ende haben Sie hinzugefügt ([^\\]|^) um z. B. Änderungen zu vermeiden \\x20 zu \\u0020. Aber wenn es ist \\\x20 dann wollen wir es ändern, es sei denn, es ist \\\\x20… würde ich schreiben encodedString.replace(/(?<!\\)((?:\\\\)*)\\x/g, '$1\\u00'). (Die $1 Erfassungsgruppe ist eine gerade Anzahl wörtlicher umgekehrter Schrägstriche, denen kein umgekehrter Schrägstrich vorangestellt ist.)

    – David Knipe

    27. Februar um 14:45 Uhr

Sie müssen es nicht entschlüsseln. Sie können es sicher manipulieren, wie es ist:

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

vielleicht hilft das: 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;
}

1643385247 433 Wie bekomme ich den Klassennamen in PHP
Илья Зеленько

2019

Sie können verwenden decodeURI oder decodeURIComponent und nicht nicht entkommen.

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

997340cookie-checkDekodieren von Hex-enthaltenden Escape-Sequenzen in JavaScript-Strings

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy