wake-up-neo.net

Javascript - Ersetzt das Escape-Zeichen in einem String-Literal

Ich versuche, das Backslash-Zeichen (Escape-Zeichen) in einem Javascript-Zeichenfolgenliteral zu ersetzen.

Ich muss es durch einen doppelten Backslash ersetzen, damit ich dann eine Umleitung durchführen kann:

var newpath = 'file:///C:\funstuff\buildtools\viewer.html'.replace(/\\/g,"\\");
window.location = newpath;

Es scheint jedoch kein Ergebnis zu haben.

Ich habe nicht die Möglichkeit, die Backslashes ordnungsgemäß zu maskieren, bevor sie von Javascript verarbeitet werden.

Wie kann ich (\) durch (\\) ersetzen, damit Javascript glücklich ist?

Danke, Derek

12
dbasch

Wenn es sich um ein Literal handelt, müssen Sie die umgekehrten Schrägstriche vermeiden, bevor Javascript sie sieht. Daran führt kein Weg vorbei.

var newpath = 'file:///C:\\funstuff\\buildtools\\viewer.html';
window.location = newpath;

Wenn newpath seinen Wert von einer anderen Stelle erhält und tatsächlich einzelne Backslashes enthält, müssen Sie diese nicht verdoppeln. Aber wenn Sie es aus irgendeinem Grund wirklich wollten, vergessen Sie nicht, die umgekehrten Schrägstriche im Aufruf replace () zu umgehen:

newpath.replace(/\\/g,"\\\\");

Warum haben Sie nicht die Möglichkeit, die Backslashes ordnungsgemäß zu maskieren, bevor sie von Javascript verarbeitet werden? Wenn das Problem darin besteht, dass Ihre Javascript-Quelle aus einer anderen Skriptsprache generiert wird, die selbst\als Escape-Zeichen verwendet, fügen Sie einfach eine Escape-Stufe hinzu:

var newpath = 'file:///C:\\\\funstuff\\\\buildtools\\\\viewer.html';
21
moonshadow

Sie sollten durch "\\\\" ersetzen, da "\\" in eine einzelne\also keine Änderung übergeht.

2
McAden

Um das Verhalten beim Entziehen von Zeichenfolgen besser zu veranschaulichen und zu verstehen, nehmen Sie das folgende Beispiel:

Sie können sehen, wie der String im Speicher aussieht, nachdem er von der JS-Engine analysiert wurde, indem Sie den String aufteilen. Auf diese Weise bieten sich auch mögliche (hässliche) Lösungen für dieses Problem an:

'file:///C:\funstuff\buildtools\viewer.html'.split('')
//>
 ["f", "i", "l", "e", ":", "/", "/", "/", "C", ":", "", "u", "n", "s", "t", "u",
  "f", "f", "", "u", "i", "l", "d", "t", "o", "o", "l", "s", "", "i", "e", "w",
  "e", "r", ".", "h", "t", "m", "l"]

'file:///C:\funstuff\buildtools\viewer.html'.split('').map( function(e){
     return e.charCodeAt()
});
//>
[102, 105, 108, 101, 58, 47, 47, 47, 67, 58, 12, 117, 110, 115, 116, 117, 102,
 102, 8, 117, 105, 108, 100, 116, 111, 111, 108, 115, 11, 105, 101, 119, 101, 
 114, 46, 104, 116, 109, 108]
//>in Hex values by applying .toString(16)
["66", "69", "6c", "65", "3a", "2f", "2f", "2f", "43", "3a", "c", "75", "6e", 
 "73", "74", "75", "66", "66", "8", "75", "69", "6c", "64", "74", "6f", "6f", 
 "6c", "73", "b", "69", "65", "77", "65", "72", "2e", "68", "74", "6d", "6c"]

Grundsätzlich entgeht der einzelne Backslash dem folgenden Zeichen, was zu unerwarteten Ergebnissen führt, wenn der Escape-Kontext nicht beachtet wird.

Lösung:

Über eine Nachschlagetabelle können Sie viele fehlgeschlagene Zeichen wiederherstellen, wenn sie außerhalb des druckbaren Zeichenbereichs ASCII von \x20-\x7F liegen. Im obigen Beispiel würde beispielsweise 12 oder \x0c [12..toString(16)] zu '\\'+'v' usw.

PS: Beachten Sie, dass ein Informationsverlust aufgetreten ist und Sie versuchen, Informationen über Kontext- oder Metainformationen wiederherzustellen, was in Ihrem Fall bedeutet, dass sich die Zeichenfolge im Ausdruck befindet ASCII Bereich.

Bitte teilen Sie alle Implementierungen mit der Community. Prost!

1
Lorenz Lo Sauer