제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under jQuery

업무상(ajax 뿐만 아니라)  클라이언트쪽의 페이지 인코딩 과 서버측 인코딩이 달라서 한글이 깨지는 경우가 많이 발생한다.
물론 요즘 대부분 utf-8로 개발을 하기때문에 흔하지 않을수도있지만 환경에따라 ,어쩔수없이 euc-kr 와 utf-8을 동시에
이용해야 하는 경우가 있다.

나의 경우는,  클라이언트 페이지가 euc-kr(완성형 한글) 이지만 내부적으로 ajax 가 utf-8로 변환하여 
서버 페이지 (euc-kr)에 전송하면서,  클라이언트서버의 인코딩 환경이 맞지 않기(같지 않기때문) 때문에 생긴 문제였다

아래는 full code 는 아니지만 핵심만 요약해서 정리하였다(code가  중요하지는 않다)

(참고로 한글이 깨지지않게 하는 방법은 사실 URL 인코딩 말고, 다른방법도 있다. 하지만  URL 인코딩을 통해 데이터를 전송하면 ContentType 이나 Mime 설정 등.. 페이지 언어 설정이 필요없다.)

<script language="javascript">

       var txt;
       txt = encodeURI("가나다라마")  - // 1차  Url 인코딩(서버 함수일경우 서버 함수로)
       txt = encodeURI("가나다라마") -  // 2차  Url 인코딩(서버 함수일경우 서버 함수로)
         
        //  서브밋 처리

</script>

[변환후]

%EA%B0%80%EB%82%98%EB%8B%A4%EB%9D%BC%EB%A7%88  // 1차
%25EA%25B0%2580%25EB%2582%2598%25EB%258B%25A4%25EB%259D%25BC%25EB%25A7%2588 // 2차

(1차에서 변환한 문자열의, % 가 2차에서 %25 로만 변경된것을 볼 수 있다.)


그럼 왜 2번 해줄까? 

이유는 간단하다.  Url 인코딩된 문자열을 보존하기 위해서이다.
만약 1회만 할 경우,   서브밋시 서버에서 자동으로 디코딩을 1회 하면서 url 인코딩된 것이 
utf-8 데이터로 노출된다
그래서 한글로 변환하게되니 깨진다.  2회 하게되면,  서버측에서 자동 1회 인코딩하더라도, 1차로 Url인코딩된게 남아있기때문에 깨지지않는다.

{{ 2회 인코딩한 데이터 서버로 전송 }}
%25EA%25B0%2580%25EB%2582%2598%25EB%258B%25A4%25EB%259D%25BC%25EB%25A7%2588

{{ 서브밋 되면서 중간에 서버가 1번째 디코딩함 }}
%25EA%25B0%2580%25EB%2582%2598%25EB%258B%25A4%25EB%259D%25BC%25EB%25A7%2588

%EA%B0%80%EB%82%98%EB%8B%A4%EB%9D%BC%EB%A7%88

{{ 서버 페이지에서  2번째  디코딩함 }}
%EA%B0%80%EB%82%98%EB%8B%A4%EB%9D%BC%EB%A7%88 

 "가나다라마"  변환완료

 DB 저장함

2018/03/14 17:06 2018/03/14 17:06