웹서핑을 하다보면 종종 한글이 깨진채로 나오는 경우가 있다. 이때 수동으로 인코딩을 UTF-8이나 한국어(EUC-KR) 등으로 바꾸면 페이지가 올바르게 표시되기도 한다.
이 문제는 HTTP 서버 보내는 HTTP Content-Type Header와 관련이 있다.
HTTP/1.1 200 OK Content-Type: text/html; charset=UTF-8 Content-Length: 7188 Date: Mon, 18 Feb 2002 22:06:32 GMT Last-Modified: Fri, 10 Aug 2001 17:32:25 GMT
여기서 Content-Type에 명시적으로 문자셋(charset)을 줄 경우 브라우저는 해당 문자셋으로 페이지를 보여주면 된다. 하지만 다음과 같이 문자셋이 생략되어 오는 경우가 종종 있다.
HTTP/1.1 200 OK Content-type: text/html
HTTP 규격(specification)에 따르면 문자셋이 생략되었을 경우 디폴트 인코딩은 ISO-8859-1 (Latin1)이 되어야 한다. 하지만 대부분의 웹브라우저는 이 표준을 따르기보다는 각자의 방법으로 해당 페이지가 어떤 인코딩을 사용하고 있는지 추측하는 방식을 사용한다.
한 예로 대표적인 오픈 소스 브라우저인 파이어폭스(Firefox)의 경우 내부적으로 인코딩 디텍션 모듈을 가지고 있는데, [A composite approach to language/encoding detection]란 글에 보면 이 알고리즘을 자세히 설명하고 있다. 소스 코드 mozilla/intl/chardet 디렉토리에서 그 구현을 볼 수 있다(저 글이 작성된 후에 구현이 조금 바뀌었다고 한다).
이 모듈은 원래 독립적으로 있다가 모질라 소스 트리에 통합되었는데, 브라우저 뿐만 아니라 웹 어플리케이션에서도 유용하게 쓰이기 때문에 자바(jchardet)와 파이썬으로도 포팅이 되어있다.