2009-09-03 5 views
12

자바 스크립트 문자열 리터럴에서 백 슬래시 (이스케이프) 문자를 바꾸려고합니다.Javascript - 문자열 리터럴에서 이스케이프 문자 바꾸기

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

그러나, 어떤 결과가없는 것 같다 : 다음 리디렉션을 수행 할 수 있도록

나는 이중 백 슬래시로 교체해야합니다.

자바 스크립트로 처리하기 전에 백 슬래시를 올바르게 이스케이프 처리 할 수있는 옵션이 없습니다.

어떻게하면 자바 스크립트가 행복해 지도록 (\)를 (\)로 대체 할 수 있습니까?

감사합니다, 데릭은 문자 그대로라면

+0

가 사용할 수있는'.replace (/ \\/g, "\\\\"). 예를 들어 HTML 문서에 백 슬래시가 있으면'document.body.innerHTML.replace (/ \\/g, "\\\\");'로 이동하여 모든 백 슬래시를 이중 백 슬래시로 바꿉니다. – Viliami

답변

21

, 당신은 자바 스크립트를 볼 수 전에 백 슬래시를 이스케이프 할 필요가; 그 주위에는 방법이 없습니다.

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

newpath하면, 당신은 그들을 두 번 할 필요가 없습니다 단일 백 슬래시를 포함 않습니다 정말 다른 곳에서 그 값을 받고,하고; 당신이 정말로 어떤 이유로 원한다면하지만, 바꾸기() 호출에서 백 슬래시를 이스케이프하는 것을 잊지 마세요 :

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

을들이 자바 스크립트에 의해 처리되기 전에 제대로 백 슬래시를 탈출 할 수있는 옵션이없는 이유 ? 문제는 당신의 자바 스크립트 소스 자체가 이스케이프 문자로 \를 사용하는 다른 스크립트 언어에서 생성되는 것입니다, 그냥 탈출의 수준을 추가

var newpath = 'file:///C:\\\\funstuff\\\\buildtools\\\\viewer.html'; 
+0

위대한 답변 moonshadow. ANT 복사 및 필터 작업에 의해 자바 스크립트에 보간되기 때문에 자바 스크립트를보기 전에 경로를 변경할 수 없습니다. 나는 ANT 과제에 대한 변경 요청을해야 할 것입니다. 문자열 리터럴에서 이스케이프 문자를 대체 할 수없는 이유를 설명 할 수 있지만 문자열 개체에서 가능합니까? 나는이를 통해 읽을 수는 있지만 이러한 차이가 존재하는 이유는 아직 표시되지 않습니다 : The Complete Javascript Strings Reference dbasch

+0

나는이를 통해 읽을 수는 있지만 이러한 차이가 존재하는 이유는 아직 표시되지 않습니다 : http://www.hunlock.com/blogs/The_Complete_Javascript_Strings_Reference 죄송합니다, Stack Overflow n00b;) – dbasch

+0

@dbasch : replace()가 실행될 때까지 문자열에 더 이상 문자가 없으므로 예제 코드에서 '\'문자를 바꿀 수 없습니다. 이스케이프 문자 : 문자열 리터럴의 구문 분석을 제어하고 프로세스에서 소비되는 문자입니다. – moonshadow

2

당신은 "\\\\"로 대체되어야한다 "\\"가 하나의 \로 변경되지 않으므로 변경되지 않습니다.

+0

나는 이것을 시도했지만 교체하지 않았다. – dbasch

0

더 설명하고 이해하려면 문자열 이스케이프 행동을, 다음과 같은 예를 취

당신은 따라서, 문자열이 문자열을 분할하여 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"] 

는 기본적으로 단일 백 슬래시는 다음 문자를 빠져 나간다 이스케이프-문맥을 무시한 경우 따라서, 예상치 못한 결과를 초래하는 :이 문제를 해결 전위 (추한) 솔루션을 제공.

솔루션 : 룩업 테이블을 통해

, 당신은 그들이 \x20-\x7F의 인쇄 가능한 ASCII 문자 범위 외부에있는 경우 많은 errantly 문자를 탈출 복원 할 수 있습니다. 예를 들어, 위 예의 경우 12 또는 \x0c [12..toString(16)]은 '\\'+'v'이됩니다.

PS : 정보의 손실이 발생한 것을 알고 있어야합니다, 당신은 문자열이 인쇄 가능한 ASCII 범위에 귀하의 경우 의미 contextual- 또는 메타 정보를 통해 정보를 복원하기 위해 노력하고 있습니다.

모든 구현을 커뮤니티와 공유하십시오. 건배! 그것으로`;

-1

< < 이스케이프 문자 교체 >> 당신이 HTML에서 백 슬래시를 저장하는 경우

import java.util.Scanner; 

public class Example7 { 

    public static void main(String[] args) { 
    Scanner in=new Scanner(System.in); 
    System.out.println("Please enter a sentence: "); 
    String a=in.nextLine(); 
    //System.out.println("the word had enter: "+a); 

    String Str1 = a.replace("\\n", "(new_line)"); 
    //System.out.println(Str1); 
    String Str2 = Str1.replace("\\t", "(tab)"); 
    //System.out.println(Str2); 
    String Str3 = Str2.replace("\\t", "(tab)"); 
    String Str4 = Str3.replace("\\\\", "(comment_line)"); 
    String Str5 = Str4.replace(":)", "(smile) "); 
    System.out.println("The new sentence:" +Str5); 
    } 
} 
관련 문제