[javascript] 언제 encodeURI / encodeURIComponent 대신 escape를 사용해야합니까?

사용 할 때 – 쿼리 문자열을 인코딩 할 때 웹 서버로 전송하는 escape()과 할 때 사용 encodeURI()하거나 encodeURIComponent():

탈출을 사용하십시오 :

escape("% +&=");

또는

encodeURI () / encodeURIComponent () 사용

encodeURI("http://www.google.com?var1=value1&var2=value2");

encodeURIComponent("var1=value1&var2=value2");



답변

탈출()

사용하지 마십시오!
escape()섹션 B.2.1.2 이스케이프에 정의되어 있으며 부록 B소개 텍스트 는 다음과 같습니다.

…이 부록에 명시된 모든 언어 기능과 동작은 하나 이상의 바람직하지 않은 특성을 가지며 레거시 사용이없는 경우이 사양에서 제거됩니다. …
… 프로그래머는 새로운 ECMAScript 코드를 작성할 때 이러한 기능과 동작이 존재하거나 존재한다고 가정해서는 안됩니다.

행동:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/escape

@ * _ +-. /를 제외한 특수 문자는 인코딩됩니다.

코드 단위 값이 0xFF 이하인 문자의 16 진 형식은 두 자리 이스케이프 시퀀스 %xx입니다.

코드 단위가 더 큰 문자의 경우 4 자리 형식 %uxxxx이 사용됩니다. RFC3986에 정의 된대로 쿼리 문자열 내에서는 허용되지 않습니다 .

query       = *( pchar / "/" / "?" )
pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded   = "%" HEXDIG HEXDIG
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

퍼센트 부호는 바로 뒤에 두 개의 16 진수가 오는 경우에만 허용되며 퍼센트 뒤에 오는 u것은 허용되지 않습니다.

encodeURI ()

작업 URL을 원할 때 encodeURI를 사용하십시오. 전화하세요 :

encodeURI("http://www.example.org/a file with spaces.html")

얻을 :

http://www.example.org/a%20file%20with%20spaces.html

URL을 파괴하고 리턴하기 때문에 encodeURIComponent를 호출하지 마십시오

http%3A%2F%2Fwww.example.org%2Fa%20file%20with%20spaces.html

encodeURIComponent ()

URL 매개 변수의 값을 인코딩하려는 경우 encodeURIComponent를 사용하십시오.

var p1 = encodeURIComponent("http://example.org/?a=12&b=55")

그런 다음 필요한 URL을 만들 수 있습니다.

var url = "http://example.net/?param1=" + p1 + "&param2=99";

그리고 당신은이 완전한 URL을 얻을 것입니다 :

http://example.net/?param1=http%3A%2F%2Fexample.org%2F%Ffa%3D12%26b%3D55&param2=99

encodeURIComponent는 '문자를 이스케이프하지 않습니다 . 일반적인 버그는을 (를) 사용 href='MyUrl'하여 주입 버그가 발생할 수있는 html 속성을 만드는 것 입니다. 문자열에서 html을 생성하는 경우 속성 따옴표 "대신을 사용 '하거나 인코딩 레이어를 추가하십시오 ( '% 27로 인코딩 가능).

이러한 유형의 인코딩에 대한 자세한 내용은 다음을 확인하십시오. http://en.wikipedia.org/wiki/Percent-encoding


답변

encodeURIComponent가 아닌 encodeURIComponent에 의해 인코딩 된 정확히 11 자 사이의 차이점은 다음 encodeURI()encodeURIComponent()같습니다.

encodeURI와 encodeURIComponent의 10 가지 차이점이있는 테이블

이 코드를 사용하여 Chrome의 console.table 을 사용 하여이 테이블을 쉽게 생성했습니다 .

var arr = [];
for(var i=0;i<256;i++) {
  var char=String.fromCharCode(i);
  if(encodeURI(char)!==encodeURIComponent(char)) {
    arr.push({
      character:char,
      encodeURI:encodeURI(char),
      encodeURIComponent:encodeURIComponent(char)
    });
  }
}
console.table(arr);


답변

이 기사를 밝히는 것을 발견했습니다 :
Javascript Madness : Query String Parsing

decodeURIComponent가 ‘+’를 올바르게 디코딩하지 못한 이유를 알아 내려고 할 때 찾았습니다. 추출은 다음과 같습니다.

String:                         "A + B"
Expected Query String Encoding: "A+%2B+B"
escape("A + B") =               "A%20+%20B"     Wrong!
encodeURI("A + B") =            "A%20+%20B"     Wrong!
encodeURIComponent("A + B") =   "A%20%2B%20B"   Acceptable, but strange

Encoded String:                 "A+%2B+B"
Expected Decoding:              "A + B"
unescape("A+%2B+B") =           "A+++B"       Wrong!
decodeURI("A+%2B+B") =          "A+++B"       Wrong!
decodeURIComponent("A+%2B+B") = "A+++B"       Wrong!


답변

encodeURIComponent가 인코딩하지 않아 -_.!~*'()XML 문자열에서 PHP에 데이터를 게시하는 데 문제가 발생합니다.

예를 들면 다음과 같습니다.
<xml><text x="100" y="150" value="It's a value with single quote" />
</xml>

일반 탈출 encodeURI
%3Cxml%3E%3Ctext%20x=%22100%22%20y=%22150%22%20value=%22It's%20a%20value%20with%20single%20quote%22%20/%3E%20%3C/xml%3E

작은 따옴표는 인코딩되지 않습니다. 문제를 해결하기 위해 인코딩 URL에 대해 프로젝트의 문제를 해결하는 두 가지 기능을 만들었습니다.

function encodeData(s:String):String{
    return encodeURIComponent(s).replace(/\-/g, "%2D").replace(/\_/g, "%5F").replace(/\./g, "%2E").replace(/\!/g, "%21").replace(/\~/g, "%7E").replace(/\*/g, "%2A").replace(/\'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29");
}

디코딩 URL의 경우 :

function decodeData(s:String):String{
    try{
        return decodeURIComponent(s.replace(/\%2D/g, "-").replace(/\%5F/g, "_").replace(/\%2E/g, ".").replace(/\%21/g, "!").replace(/\%7E/g, "~").replace(/\%2A/g, "*").replace(/\%27/g, "'").replace(/\%28/g, "(").replace(/\%29/g, ")"));
    }catch (e:Error) {
    }
    return "";
}


답변

encodeURI ()-escape () 함수는 HTTP가 아닌 자바 스크립트 이스케이프를위한 것입니다.


답변

작은 비교표 Java 대 JavaScript 대 PHP.

1. Java URLEncoder.encode (using UTF8 charset)
2. JavaScript encodeURIComponent
3. JavaScript escape
4. PHP urlencode
5. PHP rawurlencode

char   JAVA JavaScript --PHP---
[ ]     +    %20  %20  +    %20
[!]     %21  !    %21  %21  %21
[*]     *    *    *    %2A  %2A
[']     %27  '    %27  %27  %27 
[(]     %28  (    %28  %28  %28
[)]     %29  )    %29  %29  %29
[;]     %3B  %3B  %3B  %3B  %3B
[:]     %3A  %3A  %3A  %3A  %3A
[@]     %40  %40  @    %40  %40
[&]     %26  %26  %26  %26  %26
[=]     %3D  %3D  %3D  %3D  %3D
[+]     %2B  %2B  +    %2B  %2B
[$]     %24  %24  %24  %24  %24
[,]     %2C  %2C  %2C  %2C  %2C
[/]     %2F  %2F  /    %2F  %2F
[?]     %3F  %3F  %3F  %3F  %3F
[#]     %23  %23  %23  %23  %23
[[]     %5B  %5B  %5B  %5B  %5B
[]]     %5D  %5D  %5D  %5D  %5D
----------------------------------------
[~]     %7E  ~    %7E  %7E  ~
[-]     -    -    -    -    -
[_]     _    _    _    _    _
[%]     %25  %25  %25  %25  %25
[\]     %5C  %5C  %5C  %5C  %5C
----------------------------------------
char  -JAVA-  --JavaScript--  -----PHP------
[ä]   %C3%A4  %C3%A4  %E4     %C3%A4  %C3%A4
[ф]   %D1%84  %D1%84  %u0444  %D1%84  %D1%84


답변

이러한 방법 중 하나를 그대로 사용하지 않는 것이 좋습니다. 올바른 일을하는 자신의 함수를 작성하십시오.

MDN은 아래에 표시된 URL 인코딩에 대한 좋은 예를 제시했습니다.

var fileName = 'my file(2).txt';
var header = "Content-Disposition: attachment; filename*=UTF-8''" + encodeRFC5987ValueChars(fileName);

console.log(header);
// logs "Content-Disposition: attachment; filename*=UTF-8''my%20file%282%29.txt"


function encodeRFC5987ValueChars (str) {
    return encodeURIComponent(str).
        // Note that although RFC3986 reserves "!", RFC5987 does not,
        // so we do not need to escape it
        replace(/['()]/g, escape). // i.e., %27 %28 %29
        replace(/\*/g, '%2A').
            // The following are not required for percent-encoding per RFC5987, 
            //  so we can allow for a little better readability over the wire: |`^
            replace(/%(?:7C|60|5E)/g, unescape);
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent