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
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';
Sie sollten durch "\\\\" ersetzen, da "\\" in eine einzelne\also keine Änderung übergeht.
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!