인코딩 대신 이스케이프를 사용해야 하는 경우

웹 서버로 보낼 쿼리 문자열을 인코딩할 때 – 언제 사용합니까?escape()언제 사용합니까?encodeURI()또는encodeURIComponent():

이스케이프 사용:

escape("% +&="); 

또는

encodeURI() / encode 사용URIC 구성 요소()

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


질문에 대한 답변



이스케이프()

쓰지 마세요! escape()섹션 B.2.1.2 이스케이프에 정의되어 있으며 Annex 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 의 경우는, URI 를 실행합니다.이 호출은 다음과 같습니다.

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

입수 방법:

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

부호화를 호출하지 않음URL이 파기되어 반환되기 때문에 URIC 구성 요소는

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

부호화에 주의해 주세요.인코딩과 같은 URIURIC 컴포넌트는 ‘ 문자를 벗어나지 않습니다.

encodeURIComponent()

인코딩 사용URL 파라미터 값을 인코딩하는 경우 URIC 컴포넌트.

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

부호화에 주의해 주세요.URIC 컴포넌트는 다음 명령어를 벗어나지 않습니다.'성격.일반적인 버그는 다음과 같은 html Atribut을 작성하기 위해 이를 사용하는 것입니다.href='MyUrl'주입 버그가 발생할 수 있습니다.문자열에서 html을 작성하는 경우 다음 중 하나를 사용합니다."대신'속성 따옴표를 사용하거나 부호화 레이어를 추가합니다('%27)로 부호화할 수 있습니다.

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




의 차이점encodeURI()그리고.encodeURIComponent()encode에 의해 부호화된 정확히 11글자입니다.URIC 컴포넌트는 인코딩에 의한 것이 아닙니다.URI:

Table with the ten differences between encodeURI and encodeURIComponent

Google 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: 쿼리 문자열 해석

내가 왜 해독하는지 알아내려다 발견했어URIC 구성 요소가 ‘+’을(를) 올바르게 디코딩하지 않았습니다.다음은 발췌입니다.

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! 



encodeURIC 컴포넌트가 인코딩되지 않음-_.!~*'()이로 인해 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

보시다시피 단일 따옴표는 부호화되지 않았습니다.문제를 해결하기 위해 프로젝트의 문제를 해결하기 위해 Encoding 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() – excape() 함수는 javascript excape용이며 HTTP가 아닙니다.