문제

다음은 예제 코드입니다(http://jsfiddle.net/epsSZ/1/):

HTML:

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">
  <label>Label:</label>
  <input type="text" name="label" size="12" maxlength="32" value="får løbende" /><br />
  <input type="submit" value="Send standart">
</form>
<button onclick="sendForm()">Send ajax!</button>

JS:

window.sendForm = function() {
  var oOutput = document.getElementById("output"),
     oData = new FormData(document.forms.namedItem("fileinfo"));
  var oReq = new XMLHttpRequest();
  oReq.open("POST", "/echo/html", true);
  oReq.send(oData);
}

표준 양식 제출을 통해 이전 방식으로 제출하면 요청 페이로드는 다음과 같습니다.

------WebKitFormBoundary2890GbzEKCmB08rz
Content-Disposition: form-data; name="label"

f&#229;r l&#248;bende

하지만 이 AJAX 방식으로 제출하면 약간 다르게 보입니다.

------WebKitFormBoundaryPO2mPRFKj3zsKVM5
Content-Disposition: form-data; name="label"

får løbende

보시다시피, 이전의 경우에는 숯이 문자 개체로 대체되지만 사용의 경우에는 FormData utf-8이기 때문에 물론 좋은 일반 문자열이 있지만 표준 양식 submit처럼 동작하게 할 가능성이 있습니까?

도움이 되었습니까?

해결책

귀하의 질문에 대한 답변은 다음과 같습니다 아니요.변경할 수 없습니다.에 따르면 XMLHttpRequest2 TR, FormData 구축된 데이터는 명시적으로 로 인코딩됨 UTF-8.변경을 허용한다는 언급은 없습니다.

일반적인 mimeType 또는 Content-Type=charset은 동일한 이유로 다르게 처리되므로 다중 부분 요청에 대해 유효하지 않게 됩니다.

인용하자면,

데이터가 FormData 인 경우 요청 엔티티 본체가 데이터 세트와 함께 데이터로 Multipart/Form-Data 인코딩 알고리즘을 실행 한 결과가되도록합니다. 명시적 문자 인코딩으로서의 UTF-8.

MIME 유형을 "multipart/form-data;", U+0020 SPACE 문자, "boundary=" 및 multipart/form-data 인코딩 알고리즘에 의해 생성된 multipart/form-data 경계 문자열의 연결로 설정합니다.

도움이 되었기를 바랍니다!

업데이트

기꺼이 포기한다면

new FormData(document.forms.namedItem("fileinfo"));

~을 위한

new FormData().append("name", "value")

실행 가능한 솔루션이 있을 수 있습니다.그것이 당신이 찾고 있는 것인지 알려주세요.

또 다른 업데이트

조금 뛰어다녔습니다. 모든 모드로 업데이트된 바이올린

그러니까 이 이야기는,

1 form with accept-charset="utf8" => 기본 동작

콘텐츠에는 추가 이스케이프/인코딩이 필요하지 않습니다.따라서 요청은 텍스트가 그대로 유지된 상태로 실행됩니다. får løbende

2 form with accept-charset="windows-1251" => 귀하의 경우

여기서 브라우저의 기본 문자 집합은 utf8이므로 콘텐츠에 추가 이스케이프/인코딩이 필요합니다.따라서 콘텐츠가 이스케이프된 다음 실행됩니다.보낸 내용은 f&#229;r l&#248;bende

3 FormData constructed with form element

콘텐츠는 기본적으로 다음과 같으므로 추가 이스케이프/인코딩이 필요하지 않습니다. utf8.따라서 요청은 다음과 같은 텍스트로 실행됩니다. får løbende.

4 FormData constructed, and then appended with escaped data

콘텐츠는 여전히 utf8 인코딩이지만 호출해도 문제가 되지 않습니다. escape(content) 양식 데이터에 추가하기 전에.이는 요청이 다음과 같은 텍스트와 함께 실행됨을 의미합니다. f%E5r%20l%F8bende.아직도 주사위가 없지?

내가 틀렸어, 아니야.자세히 살펴보기[읽기 => 몇 분간 쳐다보기....]

f&#229;r l&#248;bende 그리고

f%E5r%20l%F8bende

그런 다음 모든 것이 제자리에 놓였습니다. %E5 (16진수) = &#229; (소수).그래서 기본적으로 escape()Javascript가 작업을 수행하는 방식입니다. % HTML 친화적이지 않은 기반 인코딩입니다.

비슷하게 &#;, 우리가 알고 있듯이 HTML의 인코딩 방식입니다.그래서 나는 Ajax에 또 다른 모드를 추가했습니다. [당신이 찾고 있는 것이 바로 이것이었을 것 같습니다.]

5 FormData constructed, and then appended with html-escaped data

콘텐츠는 여전히 utf8 인코딩입니다.다음의 멋진 코드를 사용하여 HTML 인코딩처럼 이스케이프 처리해도 문제가 되지 않습니다. 스택 오버플로.짜잔, 요청이 텍스트와 함께 실행되었습니다. f&#229;r l&#248;bende

모든 모드로 업데이트된 바이올린

이것이 문제를 해결하는 데 도움이 되기를 바랍니다!

windows-1251 전체 지원 업데이트

이것 привет får løbende 이전 모드에서 입력이 실패했습니다 5.바이올린 업데이트 http://jsfiddle.net/epsSZ/6/.

여기서는 여러 가지 솔루션 조합을 사용합니다. https://stackoverflow.com/a/2711936/1304559 그리고 내.그래서 문제는 모든 것을 탈출하는 것입니다.이제 windows-1251 문자 세트에 없는 문자만 이스케이프 처리합니다.

이것이 도움이 되기를 바랍니다!

다른 팁

이 질문에 감사 드리며, 나는 나 자신을 즐겼습니다!:)

를 교체하십시오
<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="windows-1251">
.

<form enctype="multipart/form-data" action="/echo/html" method="post" name="fileinfo" accept-charset="utf-8">
.

문제는 accept-charset windows-1251 대신 utf-8

입니다.

이후

oReq.open("POST", "/echo/html", true);
.

또한

를 추가 할 수 있습니다.
oReq.overrideMimeType('text/html; charset=UTF-8');
oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
.

그러나 이것은 문제를 해결하는 것이 아닙니다.

행운을 빈다.:)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top