웹 서비스를 제공할때 문서의 캐릭터 인코딩을 지정하는 방법은 여러 가지가 있다.

 

먼저 HTTP 의 Header 의 Content-Type 에 charset 헤더로 지정하는 방법이다.

< Date: Tue, 29 Apr 2014 08:59:59 GMT
< Server: Apache/2.2.15 (CentOS)
< Accept-Ranges: bytes
< Last-Modified: Tue, 05 Feb 2013 12:07:31 GMT
< Content-Length: 4558
< Connection: close
< Content-Type: text/html; charset=UTF-8
CODE

 

apache web 서버의 경우 AddDefaultCharset 지시자를 사용하여 모든 content 의 encoding 을 정의할 수 있다. RHEL/CentOS 에 탑재된 아파치는 기본적으로 다음과 같이 설정되어 있다.

AddDefaultCharset UTF-8
CODE

 

두번째는 Document 마다 meta 태그로 encoding을 지정하는 방법이다.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
CODE

HTML5 는 다음과 같이 간소하게 지정할 수 있다.

<meta charset="utf-8">
CODE

 

그동안 HTTP 헤더에 charset이 지정되어 있어도 Document 에 meta 태그가 있으면 Document  설정이 우선하는줄 알고 있었다.

오늘 사정때문에 EUC-KR로 된 컨텐츠이고 meta 태그도 정확하게 charset=EUC-KR" 으로 지정되었는데 웹서버를  apache 로 변경한 이후에 브라우저에서 깨져 보이는 현상을 발견했다.

 

curl 의 -v 옵션으로 HTTP Header 를 보니 "Content-Type: text/html; charset=UTF-8" 으로 지정되어 있지만 meta 로 인코딩이 명시되어 있는데 왜 깨져 보일까 하고 해당 HTML 표준을 찾아보니 다음과 같은 부분이 있었다.

  1. If the user has explicitly instructed the user agent to override the document's character encoding with a specific encoding, optionally return that encoding with the confidence certain and abort these steps.

  2. If the transport layer specifies an encoding, and it is supported, return that encoding with the confidence certain, and abort these steps.

 

2 번을 보니 HTTP Header에 인코딩이 정의되어 있으면 해당 인코딩을 사용하고 그 이후 인코딩 확인은 중지하는게 표준인데 그동안 잘못 알고 있었다.

모든 문서를 UTF-8 인코딩을 사용하면 몰라도 되는 지식이지만 어떤 이유로 웹사이트에서 특정 페이지는 UTF-8 이외의 인코딩을 써야 한다면 다음과 같은 방법이 있을 수 있을 것 같다.

  1. AddDefaultCharset 은 VirtualHost 나 Directory 마다 지정 가능하다. 다른 인코딩의 문서는 별도의 VirtualHost 나 또는 Directory 에 모아 놓고 "AddDefaultCharset Off" 로 지정해서 브라우저가 meta 태그를 기반으로 인코딩을 판단하게 한다. Directory 에 지정할 경우 다음과 같이 설정하면 될 것이다.

    <Directory "/var/www/html/noneutf8">
       #  기타 설정
       AddDefaultCharset Off
    </Directory>
    CODE
  2. mod_header, mod_rewrite, mod_setenvif 를 조합하면  URI 별로 AddDefaultCharset 을 조정할 수 있을 것 같은데 번거로울것 같고 1번 방식으로 특정 디렉터리에 모아 놓는게 처리가 간단할 듯 싶다.

 

Ref