it-swarm.com.ru

Javascript - замена escape-символа в строковом литерале

Я пытаюсь заменить символ обратной косой черты (escape) в строковом литерале Javascript. 

Мне нужно заменить его двойной обратной косой чертой, чтобы я мог сделать перенаправление:

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

Тем не менее, похоже, что нет результата. 

У меня нет возможности правильно избежать обратной косой черты, прежде чем они будут обработаны Javascript.

Как я могу заменить (\) на (\\), чтобы Javascript был счастлив?

Спасибо, Дерек

12
dbasch

Если это литерал, вы должны избежать обратной косой черты до того, как Javascript увидит их; Обойти это невозможно.

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

Если newpath получает свое значение откуда-то еще и действительно содержит одиночные обратные слэши, вам не нужно их удваивать; но если вы действительно хотите по какой-то причине, не забудьте избежать обратной косой черты в вызове replace ():

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

Почему у вас нет возможности правильно избежать обратных косых черт, прежде чем они будут обработаны Javascript? Если проблема заключается в том, что ваш источник Javascript генерируется из какого-либо другого языка сценариев, который сам использует\в качестве escape-символа, просто добавьте уровень экранирования:

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

Вы должны заменить на «\\\\», потому что «\\» превращается в один \, таким образом, никаких изменений.

2
McAden

Чтобы лучше продемонстрировать и понять экранирование строк , возьмем следующий пример:

Вы можете увидеть, как строка выглядит в памяти после анализа с помощью JS-движка, разбив строку, тем самым также предложив потенциальные (некрасивые) решения этой проблемы:

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

По сути, одиночная обратная косая черта экранирует следующий символ, что приводит к неожиданным результатам, если к контексту экранирования не обращают внимания.

Решение:

Посредством справочной таблицы вы можете восстановить многие ошибочно экранированные символы, если они находятся за пределами печатаемого ASCII диапазона символов \x20-\x7F. Например, для приведенного выше примера 12 или \x0c [12..toString(16)] станут '\\'+'v' и т.д.

PS:Имейте в виду, что произошла потеря информации, и вы пытаетесь восстановить информацию с помощью контекстной или метаинформации, что означает, что в вашем случае строка находится в печатной форме ASCII спектр.

Пожалуйста, поделитесь любыми реализациями с сообществом. Ура!

1
Lorenz Lo Sauer