인터넷을 검색해보면 한글 깨짐 문제에 대한 많은 솔루션들이 존재한다. 그것은 전송하려는 값에 encodeURIComponent()함수를 사용하여 인코딩 하는 방법이다. 나 역시도 서버에 값들을 보내기 위해 보내는 값마다 열심히 함수를 붙여서 코딩을 했다.
그러다가 이런 생각이 들었다.
"어차피 죄다 인코딩 해주는거 jQuery 안에서 모두 처리하게 해주면 안되나?"
그래서 jQuery소스의 AJAX관련 코드를 뒤지다가 파라메터들을 직렬화 해주는 함수에 이를 적용할 수 있을 것으로 판단했다. (본 내용은 1.2.6 버전 기준으로 작성)
① 에디터로 jquery-1.2.6.js 을 연다.
② 직렬화 함수인 param함수를 찾는다. (Ctrl+F 하고 param을 쳐보자 ^^)
③ encodeURIComponent()함수를 escape()함수로 싼다. (아래 코드 참조)
// Serialize an array of form elements or a set of
// key/values into a query string
param: function( a ) {
var s = [];
// If an array was passed in, assume that it is an array
// of form elements
if ( a.constructor == Array || a.jquery )
// Serialize the form elements
jQuery.each( a, function(){
s.push( escape(encodeURIComponent(this.name)) +"=" + escape(encodeURIComponent( this.value )));
});
// Otherwise, assume that it's an object of key/value pairs
else
// Serialize the key/values
for ( var j in a )
// If the value is an array then the key names need to be repeated
if ( a[j] && a[j].constructor == Array )
jQuery.each( a[j], function(){
s.push( escape(encodeURIComponent(j)) + "=" + escape(encodeURIComponent( this ) ));
});
else
s.push( escape(encodeURIComponent(j)) + "=" +
// Return the resulting serialization
return s.join("&").replace(/%20/g, "+");
}
// key/values into a query string
param: function( a ) {
var s = [];
// If an array was passed in, assume that it is an array
// of form elements
if ( a.constructor == Array || a.jquery )
// Serialize the form elements
jQuery.each( a, function(){
s.push( escape(encodeURIComponent(this.name)) +"=" + escape(encodeURIComponent( this.value )));
});
// Otherwise, assume that it's an object of key/value pairs
else
// Serialize the key/values
for ( var j in a )
// If the value is an array then the key names need to be repeated
if ( a[j] && a[j].constructor == Array )
jQuery.each( a[j], function(){
s.push( escape(encodeURIComponent(j)) + "=" + escape(encodeURIComponent( this ) ));
});
else
s.push( escape(encodeURIComponent(j)) + "=" +
escape(encodeURIComponent( jQuery.isFunction(a[j]) ? a[j]() : a[j] ) ));
// Return the resulting serialization
return s.join("&").replace(/%20/g, "+");
}
이미 encodeURIComponent()라는 함수로 모든 값들을 처리하고 있었다. 이미 인코딩 처리를 하고 있는데 무엇이 문제였을까 하고 계속 검색하다가 찾은 방법이 escape()라는 함수를 덧 붙여 사용하는 방법이다.
이 방법을 사용하면 각자 작성하는 코드에서 값마다 일일이 인코딩 처리를 안해주어도 된다.
그러나 정작 작성하고도 왜 escape()를 붙였을 경우 제대로 전송이 되는지에 대해서는 이해가 가지 않는다.
혹시 이 글을 본 다른 개발자 분들의 조언을 부탁드리며...
출처 : http://elemen.tistory.com/45