새로운 FormData(XHR2) 객체 또는 해결 방법에 대해 accept-charset을 설정할 수 있습니까?
-
21-12-2019 - |
문제
다음은 예제 코드입니다(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år lø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år lø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år løbende
그리고
f%E5r%20l%F8bende
그런 다음 모든 것이 제자리에 놓였습니다. %E5
(16진수) = å
(소수).그래서 기본적으로 escape()
Javascript가 작업을 수행하는 방식입니다. %
HTML 친화적이지 않은 기반 인코딩입니다.
비슷하게 &#;
, 우리가 알고 있듯이 HTML의 인코딩 방식입니다.그래서 나는 Ajax에 또 다른 모드를 추가했습니다. [당신이 찾고 있는 것이 바로 이것이었을 것 같습니다.]
5 FormData constructed, and then appended with html-escaped data
콘텐츠는 여전히 utf8 인코딩입니다.다음의 멋진 코드를 사용하여 HTML 인코딩처럼 이스케이프 처리해도 문제가 되지 않습니다. 스택 오버플로.짜잔, 요청이 텍스트와 함께 실행되었습니다. får lø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");
.
그러나 이것은 문제를 해결하는 것이 아닙니다.
행운을 빈다.:)