web-dev-qa-db-fra.com

Javascript - Remplacement du caractère d'échappement dans un littéral de chaîne

J'essaie de remplacer le caractère barre oblique inverse (d'échappement) dans un littéral de chaîne Javascript. 

Je dois le remplacer par une double barre oblique inversée pour pouvoir ensuite faire une redirection:

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

Cependant, il semble n'y avoir aucun résultat. 

Je n'ai pas l'option d'échapper correctement aux barres obliques inverses avant qu'elles ne soient gérées par Javascript.

Comment puis-je remplacer (\) par (\\) pour que Javascript soit content?

Merci, Derek

12
dbasch

S'il s'agit d'un littéral, vous devez échapper aux barres obliques inverses avant Javascript les voit; il n'y a pas moyen de contourner ça.

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

Si newpath tire sa valeur ailleurs et contient réellement des barres obliques inverses simples, vous n'avez pas besoin de les doubler; mais si vous le vouliez pour une raison quelconque, n'oubliez pas d'échapper aux barres obliques inverses dans l'appel replace ():

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

Pourquoi n’avez-vous pas la possibilité d’échapper correctement les barres obliques inverses avant qu’elles ne soient gérées par Javascript? Si le problème est que votre source Javascript est générée à partir d'un autre langage de script qui utilise lui-même\comme caractère d'échappement, ajoutez simplement un niveau d'échappement:

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

Vous devriez remplacer par "\\\\" car "\\" s'échappe dans un seul\donc pas de changement.

2
McAden

Pour mieux illustrer et comprendre le comportement d'échappement de chaîne, prenons l'exemple suivant:

Vous pouvez voir à quoi ressemble la chaîne en mémoire après son analyse par le moteur JS en la scindant, offrant ainsi des solutions potentielles (laides) autour de ce problème:

'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"]

Fondamentalement, la barre oblique inverse unique échappe au caractère suivant, donnant ainsi lieu à des résultats inattendus, si le contexte d'échappement n'est pas pris en compte.

Solution:

Grâce à une table de correspondance, vous pouvez restaurer de nombreux caractères échappés par erreur s'ils se situent en dehors de la plage de caractères imprimables ASCII de \x20-\x7F. Par exemple, pour l'exemple ci-dessus, 12 ou \x0c [12..toString(16)] deviendrait '\\'+'v', etc.

PS: Soyez conscient qu’une perte d’informations s’est produite et que vous essayez de restaurer des informations par le biais d’informations contextuelles ou méta, ce qui signifie dans votre cas que la chaîne est imprimable ASCII gamme.

S'il vous plaît partager toutes les mises en œuvre avec la communauté. À votre santé!

1
Lorenz Lo Sauer