IT/컴퓨터와 한글

컴퓨터에서의 한글 처리 (7) HTML 파일 - 인코딩, charset

smores 2013. 5. 5. 07:20

앞서의 포스트들에서 한글 인코딩과 관련한 이해를 위하여 여러가지 실험을 해 보았다. 간단히 정리하자면


윈도우즈 커맨드 프롬프트모드 및 전반적인 파일 시스템에서는 기본적으로 EUC-KR (CP949) 를 따르는데 비해 리눅스(우분투)는 UTF-8 을 기반으로 한글을 처리하는  것으로 보인다.


한편 대다수의 웹 페이지들은 오늘날은 UTF-8 인코딩으로 작성되어 있으나 일부 소수의 사이트는 예전방식을 따를 경우 웹브라우저에서 코딩 방식을 맞추어 주지 못하면 한글이 다 깨어져서 보이질 않는 상황이 발생한다.


이번 포스트는 웹페이지에 를 파이썬으로 다룰때 한글이 들어간 경우의 한글 코드 인코딩에 대한 를 어떻게 처리하는가에 대한 이야기이다. 


일전에 어느분의 부탁으로 대법원의 판례 자료들을 파이썬 코드로 자동으로 다운로드 받도록 프로그램을 만들어 드린 바 있다.   (일종의 web scraping) 총 9000여개의 데이터여서 손으로 하나씩 하기에는 너무도 버겁기 때문이다. 비슷한 일들을 미국 웹사이트에서는 가끔 해 보았기에 해 드린다고 시작하고 나니 내 파이썬 실력으로는 한글 코드 관련한 지식의 부족으로 한글 검색을 못하겠다는 사실... 결국은 웹 소스 봐가면서 다운받을 링크 근방의 다른 영어 키워드를 가지고 찾아가도록 겨우 겨우 프로그램을 해 드렸다. 당시 한글 인코딩 지시어가 어떤 의미를 지니는지도 정확히 이해를 못하는 상황에서 (지금은 이해하고 있는가?) 그냥 UTF-8 로 코드 시작부에 넣어 놓고 EditPlus 로 Plain Text (ANSI) 코드를 작성해서 그냥 시행착오로 코드를 만들고 테스트해 가면서 일을 마쳤다. 그래서 이제는 이것을 다시 되짚어보고 싶어졌다.



비교 테스트를 위하여 다음의 두 링크를 준비해 보았다.


대법원 판례 리스트


천리안에 있는 개인 홈페이지 (매우 오래전에 만든 학교 선생님의 홈페이지인듯 함. 원래는 프레임이 있는데 프레임 내의 소스 링크만 가져와서 테스트함)


첫번째 것은 크롬 브라우저에서 안깨지고 잘 보인다. 두번째 것은 한글이 다 깨져서 파이어폭스 또는 IE 를 꼭 써야 내용을 볼 수 있는 상황이었다.




다음과 같은 간단한 파이썬 코드로 웹페이지를 다운받아 텍스트 파일로 저장하고 비교해 본다.



import urllib2


def WebLinkSave(url, savedfilename):

try:

f = urllib2.urlopen(url)

except:

ReportError("Cannot find url: " + url)

return None

output = open(savedfilename,'wb')

binaryfile = f.read()

output.write(binaryfile)

output.close()

return binaryfile


#### main #############################


WebLinkSave("http://www.scourt.go.kr/portal/dcboard/DcNewsListAction.work?gubun=44&searchOption=", "1.html")

WebLinkSave("http://user.chol.com/~deuckgi/main-b.htm", "2.html")



다운받은 1.html 과 2.html 을 크롬 브라우저로 열어보면 여전히 하나는 안깨지고 하나는 깨진다.



그런데 두 파일 확장자를 .txt 로 바꾸어 저장한 후 notepad로도 열어 보면 둘다 한글이 잘 보인다. 




두 소스에서 가장 큰 차이라면 좌측것은 content charset 이 euc-kr 로 정의되고 우측은 그런 정의가 없다는 사실. 노트패드로 각각의 파일 포맷은 둘 다 동일하게 Plain Text 임은 이미 확인해 둔 상태이다. 그래서 이 문자세트 부분만을 우측 소스에도 복사해 넣고 크롬 브라우저에서 열어보면 더이상 한글이 깨지지 않는다. 





이상의 실험 결과를 바탕으로 조금 더 체계적으로 다양한 테스트를 시도하기로 한다. 기본 아이디어는 HTML 소스 자체의 포맷을 EUC-KR (Plain Text) 과 UTF-8 로 저장해 놓고 HTML 시작부분에 charset 정의를 넣거나 빼고, 정의된 인코딩 방식도 바꾸는 식으로 테스트해 보는 것이다. 테스트를 위한 HTML 소스는 전부 노트패드로 만든다.


코드는 다음과 같다. 


<html>

<body>

한글<br>

English<br>

</body>

</html>


우선 Plain Text 로 저장한 결과이다. 다음 세 그림은 윈도우7 에서 크롬, IE, 파이어폭스로 본 경우이다. 




파이어폭스나 IE 의 경우는 인코딩 옵션을 Autodetect - Korean 을 선택해 놓았다. 




같은 파일을 우분투에서도 Chromium 과 파이어폭스로 열어본다. 역시 파이어폭스는 Autodetect - Korean 선택.




개인적으로 이런 인코딩 우선순위를 크롬에서는 어떻게 잡아주는 줄 모르기에 매번 이런 깨지는 사이트가 나오면 링크 복사해서 파이어폭스 또는 IE 를 다시 열어서 보곤 한다. -_- 



다음으론 동일한 코드에 charset 알려주는 문장 한줄을 첨가한다.


<html>

<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />

<body>

한글<br>

English<br>

</body>

</html>


이제는 크롬, Chromium 에서도 잘 보인다.





마찬가지 방법으로 HTML 파일 자체를 UTF-8 포맷으로 저장한 후 동일한 실험을 해 본다. 그림에서 파일 이름을 잘 보면 P-N / P-U / U-N / U-U 로 되어 있으며 앞의 글자는 P는 plain text, U 는 utf-8 포맷으로 저장했음을 의미하고 뒤의 글자는 N 은 charset 정의가 없는 경우, U 는 EUC-KR (실수다... E 라고 하려고 생각했었는데... 귀찮으니까 그냥~~) 을 의미한다.






모두 다 잘 보인다. 한가지 재미있는 점은 charset 을 euc-kr 로 정의해 주거나 파일 자체를 UTF-8 로 저장해 놓은 경우 크롬 계열은 영문 폰트가, 파폭은 윈도우에서는 영문 폰트만, 우분투에서는 영문/한글 폰트 모두 변한다는 사실. 파폭의 경우는 옵션에서 인코딩에 따른 폰트를 따로 정의할 수 있어서 이것과 관련되었다고 생각된다. 어쨌거나 브라우저에서는 소스 파일의 인코딩도 체크하고, 소스 내에서의 charset 정의도 판단해 가면서 적절한 방법으로 웹페이지를 보여주는 모양이다. 다만 IE, 파폭의 경우 소스내에 코드에 한글 등 비 아스키 문자가 섞이는 경우 인코딩 기본설정에 따라서 코드의 코딩 방식을 체크해서 적절한 디코딩을 해서 보여주는 듯 하다.


이 가정을 확인해 보기 위해 IE 와 파이어폭스에서 소스 인코딩 옵션을 바꾸면서 글자가 잘 보이는지 테스트 해 보았다. 다음은 FF의 예이다. FF는 한글 인코딩 방식을 무려 4가지나 지원한다.







UTF-8 인 경우


EUC-KR


JOHAB


ISO-2022-KR



대략 도표를 만들어 보면 다음과 같다. 



내용을 들여다 보면 브라우저의 인코딩 옵션이란 것이 소스코드의 저장 포맷의 파악 방법을 의미하는 것 같은데 (내부의 charset 정의가 아니라) 파이어폭스의 경우 EUC-KR(plain text)로 저장된 파일 속에 charset을 UTF-8 로 정의해 놓으면 UTF-8 인코딩으로 자동으로 잡히면서 글자는 깨어진다. 그리고 charset 정의가 실제 한글 코드의 인코딩을 바꾸는 것이 아니라 물리적인 코드는 저장된 코드 포맷에 의해 정해지는 것 같다. 


그렇다면 charset 의 역할이 뭔지 많이 햇갈린다. 아마도 웹개발 전문으로 하는 분들은 이런거는 거의 기본으로 다 알고 할 터이지만 역시 정식으로 배우거나 일하지 않는 나같은 취미 아마추어 입장에서는 이런식으로 하나하나 테스트하면서 이해하려니 거의 왕 삽질이다.


본 포스트들에서는 유니코드 포맷(초기 UCS-2, UTF-16 방식들)의 파일은 아예 취급하지 않으려 한다. 실제 소프트웨어 업계에서는 그런 방식들을 어디에 어떻게 쓰는지는 모르겠지만 나같은 취미 컴 라이프를 즐기는 입장에서는 현재로는 그런 것 까지 생각하고 싶지도 않다.


이것 저것 테스트는 잔뜩 하는데 하다보니 내가 무엇을 목표로 이런 테스트를 하고 있는지 잊고 있다. 조금 생각을 정리한 후 더 나아가야 할 듯 하다.