> 웹 프론트엔드 > JS 튜토리얼 > GBK 인코딩(비보조 인코딩 방법)에서 jQuery ajax 양식 제출을 위한 궁극적인 솔루션_jquery

GBK 인코딩(비보조 인코딩 방법)에서 jQuery ajax 양식 제출을 위한 궁극적인 솔루션_jquery

WBOY
풀어 주다: 2016-05-16 18:18:16
원래의
1151명이 탐색했습니다.
머리말:
jquery ajax가 utf-8(페이지 utf-8, 수신 utf-8)로 인코딩되면 문제가 없습니다. 정상적으로 게시하고 얻을 수 있으며 페이지를 처리하여 올바른 콘텐츠를 직접 얻을 수 있습니다.
그러나 다음과 같은 경우에는
GBK -> AJAX POST ->GBK
UTF-8 -> AJAX POST ->GBK
뒤에 있는 코드가 올바른 콘텐츠를 가져올 수 없습니다. 일반적으로 이상한 문자를 얻으려면 물음표를 사용합니다.
기본 솔루션:
1: 송신 페이지와 수신 페이지 모두 UTF-8 인코딩을 사용합니다.
2: 전송 페이지에서 ajax 게시 메소드를 호출하기 전에 encodeURIComponent를 사용하여 중국어 콘텐츠가 포함된 입력을 한 번 인코딩하고, 수신 페이지에서는 디코딩 메소드(예: java.net.urldecoder.decode("Content received")를 호출합니다. ,"utf-8")).

그 중 첫 번째 방법은 의심할 여지 없이 가장 간단하고 직접적이지만 많은 프로젝트에서 utf-8 인코딩을 사용하지 않기 때문에 비현실적인 경우가 많습니다. 예를 들어 대부분의 국가에서는 gbk 인코딩을 사용하고 있습니다. 이러한 문제를 해결하는 것은 불가능합니다. 전체 프로젝트를 UTF-8 인코딩으로 변환하는 것은 비용이 너무 많이 들고 위험합니다.
두 번째 방법은 현재 대부분의 사람들이 사용하는 방법으로 흔히 2차 인코딩이라고 합니다. 왜 2차 인코딩이라고 부르는지는 나중에 설명하겠습니다. 클라이언트는 두 번 인코딩하고 서버는 두 번 디코딩합니다. 하지만 이 방법의 단점은 프론트엔드에서 한 번 코딩하고 백엔드에서 수동으로 디코딩한다는 점입니다. 주의하지 않으면 잊어버리게 되고, 코드가 프론트엔드 로직과 혼합됩니다.
상호작용 프로세스:
양식을 사용하여 기존 방식(AJAX가 아닌 제출)으로 게시하고 제출하는 경우 브라우저는 현재 페이지에 따라 인코딩하고 한 번 인코딩한 다음 서버로 보냅니다. 서버가 양식을 수신하면 자동으로 한 번 인코딩됩니다. 일반적으로 이 프로세스는 프로그램에 투명하므로 수동 인코딩 및 디코딩을 사용하면 위에서 언급한 보조 인코딩이 됩니다.
그러나 AJAX를 사용하여 제출하면 브라우저가 자동으로 인코딩하지 않으므로 jquery에 다음과 같은 코드가 있습니다.
코드 복사 코드는 다음과 같습니다.

ajax: function( s ) {
// 설정을 확장하되 's'를 다시 확장하여
// 나중에 다시 확인합니다(특히 테스트 스위트에서)
s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s))
var jsonp, jsre = /=?(&|$)/g, status, data,
type = s.type.toUpperCase()
// 문자열이 아닌 경우 데이터 변환
if ( s .data && s.processData && typeof s.data !== "string" )
s.data = jQuery.param(s.data)
.....
}

위는 jquery의 ajax 메소드 코드입니다. 다음은 jquery ajax post를 정상적으로 호출하는 코드입니다.
코드 복사 코드는 다음과 같습니다.

$.ajax({
url: ajaxurl,
type: 'POST',
dataType: 'html',
timeout: 20000 ,//Timeout 설정
data:para,//매개변수 설정
success: function(html){
}
})

위 코드를 통해 데이터가 설정되면 jquery가 내부적으로 jQuery.param 메서드를 호출하여 매개변수를 인코딩(브라우저에서 처리해야 하는 인코딩 수행)한다는 것을 알 수 있습니다.
코드 복사 코드는 다음과 같습니다.

jQuery.param=function( a ) {
var s = [ ];
function add( key, value ){
s[ s.length ] = encodeURIComponent(key) '=' encodeURIComponent(value)
// 배열이 전달된 경우
// 양식 요소의 배열이라고 가정합니다.
if ( jQuery.isArray(a) || a.jquery )
// 양식 요소 직렬화
jQuery .each( a, function(){
add( this.name, this.value );
});
// 그렇지 않으면 키/값 쌍의 객체라고 가정합니다. 🎜>else
// 키/값 직렬화 ​​
for ( var j in a )
// 값이 배열이면 키 이름을 반복해야 합니다
if ( jQuery .isArray(a[ j]) )
jQuery.each( a[j], function(){
add( j, this );
})
else
add( j, jQuery.isFunction (a[j]) ? a[j]() : a[j] )
// 결과 직렬화 반환
return s.join("&").replace(/ /g, " " );
}//jquery.param end


해결책:

encodeURIComponent는 utf-8로 인코딩됩니다. gbk 인코딩에서 gbk로 인코딩할 수 있나요?

아직 encodeURIComponent를 고려 중이라면 죄송합니다. encodeURIComponent는 utf-8만 인코딩할 수 있고 다른 인코딩을 위한 다른 API는 없습니다. 하지만 걱정하지 마세요. 아래를 살펴보세요.

encodeURIComponent는 중국어, 한국어 등 특수 문자를 utf-8 형식의 URL 인코딩으로 변환합니다.

escape0~255 이외의 유니코드 값을 인코딩할 경우 %u**** 형식이 출력되며 그 외의 경우 escape, encodeURI, encodeURIComponent의 인코딩 결과는 동일합니다. .

하하, 희망이 보이시나요? 맞습니다. encodeURIComponent 메서드 대신 escape를 사용하세요. 하지만 주의해야 할 점은 다음과 같습니다.

escape인코딩되지 않은 문자는 69개입니다: *, ,-,.,/,@,_,0-9,a-z,A-Z

encodeURIComponent 71개의 인코딩되지 않은 문자가 있습니다: !, ', (,), *, -, ., _, ~, 0-9, a-z, A-Z

escape를 사용한 후에는 더하기 기호를 인코딩해야 합니다. 그렇지 않으면 콘텐츠에 더하기 기호가 포함된 경우 서버에 의해 공백으로 변환됩니다.

드디어 해결책을 알았습니다. jquery 코드를 다시 작성하세요.

코드 복사 코드는 다음과 같습니다.

jQuery.param=function( a ) {
var s = [ ]
var encode=function(str){
str=escape(str); str.replace( / /g,"%u002B");
return str;
}
function add( key, value ){
s[ s.length ] = encode(key) '=' encode (value);
};
// 배열이 전달된 경우
// 양식 요소의 배열이라고 가정합니다.
if ( jQuery.isArray(a) || a.jquery )
// 양식 요소 직렬화
jQuery.each( a, function(){
add( this.name, this.value );
}); >// 그렇지 않으면 키/값 쌍의 객체라고 가정
else
// 키/값 직렬화 ​​
for ( var j in a )
// 값이 다음과 같은 경우 배열이면 키 이름을 반복해야 합니다.
if ( jQuery.isArray(a[j]) )
jQuery.each( a[j], function(){
add( j, this ) ;
}) ;
else
add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] )// 결과 직렬화를 반환합니다.
return s.join("&").replace(/ /g, " ");
}


위 코드는 jquery 소스 파일에서 다시 작성할 필요가 없습니다. . 원래 메서드를 덮어쓰려면 javascript를 붙여넣어 프로젝트에 추가할 수 있지만 jquery가 로드된 후에야 합니다.
사전 검증 결과 위 코드는 유니코드로 인코딩되었기 때문에 UTF-8 인코딩에서도 정상적으로 작동할 수 있습니다.

이렇게 하면 프런트엔드와 백엔드 모두에 영향을 미치는 보조 인코딩을 사용할 필요가 없습니다. gbk 인코딩 하의 Ajax 포스트는 더 이상 문제가 되지 않습니다. 이것이 궁극적인 해결책입니다. 하하.

관심 있는 분들은 http://www.open-lib.com/Forum/Read_69_1.action에 접속하여 저자와 소통하실 수 있습니다.
관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿