- 1 여는 글
- 2 문자집합과 인코딩
- 2.1 문자집합
- 2.2 인코딩
- 3 유니코드
- 4 유니코드의 인코딩
- 5 (보너스) MBS 와 WCS
- 6 맺는 글
1 여는 글 #
회사에서 저녁을 먹다가 우연히 멀티바이트 캐릭터에 대해 이야기가 나왔다. 문자셋과 인코딩에 관해 공부했던 것이 오래전 일이라 간혹 잘못된 말을 했다는 것을, 저녁식사후에 kldp 사이트를 뒤적거리다가 알게 되었다. 겸사 겸사 정리를 해보고 싶어 글을 써본다. (UTF-8이 무엇인지 궁금한 일반 컴퓨터 사용자가 봐도 좋겠으나, 주로 프로그래머들에게나 필요한 정보일 것이다.
문자집합(character set)과 인코딩은 다르다. 문자집합은 추상이고, 인코딩된 결과물은 구상이다. 농담이 아니라 진담이다. 뒤에 가서 이 문자을 다시 살펴보도록 하겠다.
컴퓨터가 이해하는 것은 오직 '0'과 '1'이다. 이런 바보같은(?) 컴퓨터가 '가'이라는 글자를 어떻게 받아들이고 표현할 수 있을까. 사람들은 각 글자마다 번호 하나씩을 부여하고 이것을 표준으로 정하여 모든 곳에서 사용하기로 했다. 자주 보는 문자집합인 KSX 1001(아주 전에는 KSC 5601이라고 불렀다.)의 예를 들어보자.
- 가 -> 45217 (0xB0A1)
- 각 -> 45218 (0xB0A2)
- ...
이런 식으로 대략 2000개 정도의 한글에 숫자를 일일이 매겨놓았다. 이 단순한 1:1 관계를 문자집합이라고 한다.
이제 인코딩 차례. 사실 KSX 1001과 euc-kr의 예를 들면서 문자집합과 인코딩의 차이를 설명하긴 힘들다. 유닉스에서 많이 보이는 한글 인코딩인 euc-kr에서 글자 '가'는 45217이란 숫자로 인코딩된다. KSX 1001 문자집합과
겉보기에는 같다. 문자집합과 인코딩의 차이를 제대로 알려면 (특히 추상과 구상의 차이점을 이해하려면) 유니코드를 보아야 한다.
(좀더 추가)
3 유니코드 #
한국에서 정의한 표준인 KSX 1001에서 45217번째 글자는 '가'이다. 중국의 문자집합에서도 45217번째 글자가 '가'일까? 당연히 아니다. 이렇듯 문자집합내의 번호가 같더라도, 어떤 문자집합이냐에 따라서 표현하는 글자는 다르게 된다. 이것을 참아낼 수 있는 순수주의자(like me ;)는 많지 않다. 그래서 유니코드가 탄생하였다. 세계의 모든 글자를 하나의 문자집합안에 때려넣는 것을 목적으로 탄생한 이 단체는, 어마어마한 크기의 책 한권을 내놓음으로써 소명을 다하였다. 이 책 안에는 태어나서 처음보는 글자들이 수북히 적혀있고,(물론 한글도 들어있다) 각 글자마다 아래부분에 번호가 적혀있다. 한글을 찾아보자. 뒤적뒤적~
- 가 : U+?AC00
- 이후엔 기억 안남
대충 말해서 유니코드의 문자집합에서 0xAC00(=44032)번째 글자가 '가'라는 것이다. U+의 의미를 살짝 설명하고 유니코드의 인코딩 얘기로 넘어가려고 했는데, BMP니 32비트중 21비트만 쓴다느니 하는 소리를 쓰기 귀찮아서 U+ 에 대한 설명은 생략하기로 한다. 참고로 유니코드에는 모든 한글이 포함되어 있다. 19개의 초성, 21개의 중성, 27개의 종성과 종성이 없는 경우를 합해서 11172개다.
앞에서 말했듯, 문자집합과 인코딩은 다르다. 그럼 유니코드의 인코딩은 무엇일까?
4 유니코드의 인코딩 #
유니코드의 인코딩 중에서 3가지를 살펴보자. UTF-32, UTF-16, UTF-8이다. 가장 눈에 익은 UTF-8부터 살펴보자. (문자집합과 인코딩의 차이를 설명하는 좋은 예제이다.)
5 (보너스) MBS 와 WCS #
6 맺는 글 #
이제와 변명처럼 적는 글이지만, 상당부분 예전에 공부한 정보를 토대로 작성한 것이라 틀린 곳이 많을 것이다. 무엇보다도 이 사이트, 저 사이트 돌아다니면서, 독학으로 배운 거라 오류가 없을리 없다. 마음껏 지적 바란다.
이보다 100배쯤 나은, 신정식님이나 정주원님이 쓰신 글을 인터넷에서 찾아볼 수 있다. 신정식님의 사이트는 예전엔 접근이 안되더니 요새 다시 들어가지기 시작했다. 검색하다가 jshin.net이란 링크가 발견되면 꼭 들어가보자.
CategoryTip