2010-04-09 3 views
0

양식에 입력 된 값이 브라우저에서 올바르게 인코딩되었다고 생각했습니다. JS encodeURIComponent 결과가 FORM에 의해 생성 된 결과와 다릅니다

그러나이 간단한 테스트 파일 "test_get_vs_encodeuri.html는"그것을 보여줍니다 사실이 아니에요 :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html><head> 
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> 
    <title></title> 
</head><body> 

<form id="test" action="test_get_vs_encodeuri.html" method="GET" onsubmit="alert(encodeURIComponent(this.one.value));"> 
    <input name="one" type="text" value="Euro-€"> 
    <input type="submit" value="SUBMIT"> 
</form> 

</body></html> 

버튼을 제출 타격 :

encodeURICompenent는 유로 - %의 E2의 % 82 % AC '로 입력 값을 인코딩을 유로 - % "

는 GET 쿼리에 브라우저는 단순한를 기록하면서"80 "

  1. 누군가 설명 할 수 있습니까?

  2. Javascript를 사용하여 borwser의 FORM (windows-1252)과 동일한 방식으로 모든 것을 어떻게 인코딩합니까 ??? (이스케이프 기능이 작동하지 않아 encodeURIComponent가 작동하지 않음)?

또는 불필요한 변환을 수행하는 encodeURIComponent입니까?

답변

5

이것은 문자 인코딩 문제입니다. 귀하의 문서에서 Windows-1252 문자를 사용하고 있습니다. 은 0x80으로 Windows-1252로 인코딩 된 위치 128에 있습니다. 하지만 encodeURICompenent은 입력이 UTF-8 일 것으로 예상하므로 이 UTF-8 0xE282AC로 인코딩 된 위치 8364 (PDF)에있는 유니 코드의 charset을 사용합니다.

해결 방법은 문서에도 UTF-8을 사용하는 것입니다. 또는 UTF-8로 인 코드 된 문자열을 Windows-1252로 변환하는 매핑을 작성합니다.

+0

@ 검보 : 지금은 이해합니다. 그러나 이것은 내가 또 다른 질문에서 이미 물었다는 것을,이 망할 encodeURIComponent가 유용한 것을 생각하게한다. 나는 cp1252를 사용하더라도 FORM으로 인코딩 된 값이 잘못 될 수 없다는 것을 의미합니다. 그렇다면 왜이 encodeURIComponent를 사용하여 URI를 인코딩해야합니까? 인코딩 된 코드와 동일한 값을 리턴하는 간단한 JS escape 함수를 사용할 수 없습니다. FORM. 나는 좋지 않을 수도 있지만, 결국 브라우저의 FORM과 똑같은 것을 인코딩하는 것을 선호한다. http://stackoverflow.com/questions/2238515/encodeuricomponent-is-really-useful –

+0

@ Marco Demaio :'escape'는'escape ("€") === "% u20AC"'형식이 다릅니다. 그리고'encodeURIComponent'의 목적은 :'bar & baz'와 같은 값으로'&'를 포함하는 URI를 만들고 싶다고 상상해보십시오. ''...? foo = bar & baz ''는'&'가 특수 문자이기 때문에 두 개의 인수 (* foo *와 * baz *)로 나타납니다. 그러나''...? foo = "+ encodeURIComponent ("bar & baz ")'는 그것을 할 것입니다. – Gumbo

+0

죄송합니다. 제대로 설명하지 못했고 쓰레기를 말했습니다. GET 구성 요소에서 '&'문자를 인코딩해야한다는 것을 알고 있지만 JS를 사용하는 cp1252를 사용하여 FORM과 같은 방식으로 모든 것을 인코딩하는 방법은 무엇입니까? 이스케이프를 사용하는 것은 방법이 아니지만, encodeURICompoenent를 사용하는 것은 €이 다르게 인코딩되기 때문에 사용되지 않습니다. JS에 그렇게 할 수있는 함수가 있습니까? 죄송합니다. 질문을 업데이트했습니다. –

0

문제의 근원이 문자 인코딩이라고 생각합니다. 내가 페이지를 얻을 수 있습니다 주위 I 엉망 메타 태그의 캐릭터 세트와 다른 인코딩으로 파일을 저장하면이 같은 브라우저에서 렌더링하기 : € 당신이 얻고있는 것처럼 많이 보이는

Content encoding issue http://www.boogdesign.com/examples/encode/content-encoding-issue.png

그건 encodeURIComponent에서. 그러나 encodeURIComponent가 반환 한 것과 어떤 차이가 나는 인코딩 조합을 찾을 수 없었습니다. GET 쿼리가 반환하는 것과 차이를 만들 수 있습니다. , 제출는 (Firefox에서)이처럼 보이는 URL 제공

test-get-vs-encodeuri.html?one=Euro-%80 

This is a UTF-8 version of the page : This is your original page는 제출이 같은 URL을 제공

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-€ 

을하지만 복사하여 붙여 넣으면 내가 얻을 :

http://www.boogdesign.com/examples/encode/test-get-vs-encodeuri-utf8.html?one=Euro-%E2%82%AC 

페이지가 UTF-8이면 GET 및 encodeURIComponent가 일치하는 것처럼 보입니다.

+0

encodeURIComponent는 항상 UTF-8을 사용합니다. http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf에서 15.1.3.4 \t encodeURIComponent (uriComponent) encodeURIComponent 함수는 특정 문자의 각 인스턴스가 문자의 UTF-8 인코딩을 나타내는 하나, 둘 또는 세 개의 이스케이프 시퀀스로 대체되는 URI의 새 버전을 계산합니다. –