티스토리 뷰

발생일: 2011.06.02

문제:
얼마 전 캐릭터셋이 다른 서비스로 폼 서브밋을 보낼 때 한글이 깨지는 문제가 발생한 적이 있었다.

현재 서비스의 캐릭터셋은 utf-8 이었고, 서브밋을 보낼 대상 서비스의 캐릭터셋은 euc-kr 이었다.

서브밋을 보내기 전에 문서의 캐릭터셋을 바꿔주는 방식으로 해결했었는데,
몇 가지 주의할 점이 있어 메모해둔다.


해결책:

결론 먼저:
  1. 폼 엘리먼트에 accept-charset 속성을 추가하고 대상 서비스의 캐릭터셋 값을 준다.
      예) accept-charset="euc-kr"
  2. 스크립트에서 폼 서브밋을 보내기 전,
      document.charset = "euc-kr"; 구문을 추가한다.
  3. 폼 서브밋 후에 document.charset의 값을 원래 값으로 되돌린다.


폼 태그의 accept-charset 속성:
- 서버가 받아서 처리하기 위한 캐릭터셋을 의미한다. (W3C accept charset)
- 값이 없을 때의 기본값은 UNKNOWN 이다.
- IE의 경우, 문서와 다른 캐릭터셋을 넣을 경우 UTF-8이 사용된다. (MSDN: accept-charset)
- 참고: MDN: form


document.charset
- 도큐먼트 또는 엘리먼트의 캐릭터셋을 읽거나 변경하기 위한 속성이다. (MSDN: charset)
- IE 전용이며 표준이 아니다.
- document.charset으로 캐릭터셋을 변경 시, 히스토리 변경(앞으로 가기/뒤로 가기) 후에도 변경한 캐릭터셋이 남아있는 문제가 있다.
- 이를 해결하기 위해 폼 전송 후 document.charset을 원래대로 복구해줘야 한다.
- (예: 폼 전송 후, 또는 window의 onbeforeunload 이벤트 핸들러에서 document.charset을 복구해준다.)
- 비슷하게 Gecko 계열에는 document.characterSet을 지원하지만 읽기 전용 속성이다. (MDN: document.characterSet


예제:
현재 문서가 utf-8 캐릭터셋이고 요청 대상 서비스의 캐릭터셋이 euc-kr 이라면.

[마크업]
// accept-charset 속성에 대상 서비스의 캐릭터셋을 넣어준다.
<form action="" accept-charset="euc-kr"></form>
[스크립트]
// 요청 전 캐릭터셋을 대상 서비스의 캐릭터셋으로 설정한다.
document.charset = "euc-kr";

form.submit();

// 요청 후 캐릭터셋을 원래대로 복구한다.
if (document.charset) {
document.charset = "utf-8";
반응형
댓글
공지사항