IT/컴퓨터와 한글

컴퓨터에서의 한글 처리 (2) 인코딩 차이의 이해

smores 2013. 5. 5. 01:24

앞의 포스트에서 언급한 링크를 찾아가서 잘 읽어본 결과 나의 혼란의 많은 부분이 해결되었다. 첫번째로 나는 아직도 영어는 1바이트, 한글은 2바이트 라고 오해하고 있었다는 사실. IT 계에서 밥먹고 사는 것이 아니니까 문제는 없었지만... -_-


자세한 정리 이전에 먼저 간단한 테스트를 조금 해 보았다. 윈도우 노트패드를 열고 다음의 세가지 파일을 노트패드에서 지원하는 네가지 코드체계로 저장해 보았다.


ABC (내 old 지식대로라면 3바이트)

한글 (내 old 지식대로라면 4바이트)

ABC한글 (내 old 지식대로라면 7바이트)


노트패드는 ANSI, Unicode, Unicode big endian, UTF-8 네가지 인코딩을 지원한다. 처음 하나는 알겠는데 나머지 4가지는 뭐야?





3종류의 파일을 (e),(k),(m) 를 (e-eng, k-korean, m-mix) 라고 붙여서 구별, 4가지 인코딩과 결합해서 총 12개 파일을 만들었다. 다음으론 간단한 파이썬 코드로 이들을 바이너리 파일로 불러서 정보를 조금 분석해 본다.


filelist = [

'ansi(e).txt', 'ansi(k).txt', 'ansi(m).txt',

'utf8(e).txt', 'utf8(k).txt', 'utf8(m).txt',

'uni-(e).txt', 'uni-(k).txt', 'uni-(m).txt', 

'unib(e).txt', 'unib(k).txt', 'unib(m).txt'

]


def conv2str(buf):

s = ""

for ch in buf:

if ch>=32 and ch<127:

s = s + chr(ch)

else:

s = s + "."

return s


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


for filename in filelist:


f=open(filename,"rb")

buf=map(ord,f.read())

f.close()


print filename, "(%2d)  " % len(buf), 


#print len(buf)


for s in buf:

print "%x" % (s),

print ":", 

print conv2str(buf)




결과는 다음과 같다.



ANSI 는 내가 알고 있는 개념이 통하는 녀석이다. 나머지 놈들은 가만 보면 앞에 일종의 헤더가 3 또는 2바이트가 붙는다. 아마도 그 파일이 어떤 식으로 인코딩되어 있는지 알리는 헤더인 듯 하다. UTF-8은 영어는 1바이트가 맞는데 한글은 각각 3바이트이다 ! (전혀 모르고 있던 사실) 유니코드는 (아마도) 리틀 엔디언, 빅 엔디언으로 구분하는 듯 한글 2바이트의 바이트 순서가 서로 다르다. 앞의 헤더 역시... 게다가 영어 역시 2바이트를 쓰면서 바이트 순서를 서로 다르게 했다. 엔디언 개념을 알고 있던 것이 도움이 된다.