본문 바로가기

프로그래밍

아스키(ASCII)코드와 유니코드(Unicode)의 이해

  안철수 의원이 의대생 시절에 다른 분야의 지식을 습득하고 싶으면 '칼럼'을 쓰라는 내용을 읽은 적이 있다. 프로그래밍 언어를 공부하다보면 항상 '아스키코드, 유니코드'와 마주치는 순간이 빈번하다. 이번 내용은 내가 답답해서 쓰는 내용이다.  


 안철수 교수가 작년에 한 케이블 방송에 출연해서 공개한 이른바 '안철수 잡지 공부법'이 다시 회자되고 있습니다. 자신은 잘 모르지만, 꼭 알아야 될 전문지식이 있다면 스스로 잡지사에 전화를 걸어 원고를 쓰겠다고 요청했다고 하지요. 마감일을 지키기 위해 글을 쓰기 위해서는 공부를 해야지요. 이른바 컨트롤 엑스(cx), 컨트롤 카피(cc) 인터넷 시대 글쓰기는 금방 표가 납니다. 이리 저리 떠도는 정보들을 갈무리해서 편집된 글은 깊이가 없지요. 그래도 이런 식으로 글을 쓰다보면 하지 않은 것보다는 지식이 습득됩니다. 육화는 되지 않지만.  


항상 약어가 나오면 풀네임을 찾아보는 습관이 있기 떄문에, 약어의 풀네임부터 천천히 알아가도록 하자.


[들어가기 앞서]

1. 컴퓨터의 기본 저장 단위는 바이트(byte)이다.


2. 1바이트(byte)는 8비트(bit)이다.


3. 1byte에는 2의 8승에 해당하는 256개의 고유한 값을 저장할 수 있다.


4. 문자나 기호들의 집합을 컴퓨터에서 저장하거나, 통신 목적으로 사용할 경우에는 부호로 바꾸어야 한다.

이를 '문자 인코딩(encoding)' 또는 '부호화'라고 하며 부호화된 문자를 복원하는 것을 '복호화'라고 한다.


5. 모스부호도 일종의 문자 인코딩이다.



[아스키(ASCII) American Standard Code for Information Interchange]

풀네임에서 알 수 있듯이 1960년대 미국에서 정의한 표준화한 부호체계이다.


여러 가지 이유로 아스키코드는 7비트 즉, 128개의 고유한 값만 사용한다.

[들어가기 앞서]의 1번 : "컴퓨터의 기본 저장 단위는 1바이트(8비트)다"라고 했는데,


왜 아스키 코드는 7비트만 활용할까? 그 이유는 1비트를 통신 에러 검출을 위해 사용하기 때문이다.

통신 에러 검출을 위한 비트를 Parity Bit라고 한다.


아래 그림을 보면 0~127까지 각각 고유한 값이 할당되어 있는 걸 알 수 있다. (0부터 시작하니 총 128개)


 0부터 32까지는 인쇄와 전송 제어용으로 사용되는 알 수 없는 용어들이 가득하다.

 33부터 126까지는 숫자, 알파벳 소문자, 알파벳 대문자, 특수기호 등이 할당되어있는 것을 알 수 있다.

 아무튼 0부터 127까지 128개의 고유값을 저장하고 있다.


 이는 '영문' 키보드로 입력할 수 있는 모든 가능성을 담았다.

 영화 <마션(martian)>을 보면 주인공이 NASA와 아스키코드로 통신 하는 것을 볼 수 있다.


 그러나, 아스키코드를 이용해 다른 언어를 표현하기에는 7비트로는 부족했다. 

 그래서 8비트로 확장한 아스키 코드가 나왔다.

 사람들은 이 코드를 ANSI 코드라고 부르기 시작했다.


 7비트에서 8비트로 확장되었으니 사람들이 활용할 수 있는 문자는 몇 개가 더 늘어났을까?

 1비트 늘어났으니 2개 더 늘어났다고 생각하면 안된다. 

 

이렇게 되었으니 128개나 더 쓸 수 있게 되었다!


이때, 1바이트만으로 표현되는 경우를 SBCS(Single Byte Character Set)이라고도 한다.

반대의 경우는 MBCS(Multi-Byte Character Set)이라고 한다.


그러나! 비유럽 국가 특히 한국, 중국, 일본과 같은 문자가 많은 국가에서는 여전히 제한적이다.

(※ 우리나라의 경우 KSC5601 표준이라는 고유한 인코딩 방법으로 문자를 표현했다)


그래서 유니코드(Unicode)라는 전 세계 언어의 문자를 정의하기 위한 국제 표준 코드가 등장하게 되었다.


[유니코드(Unicode]


 한글은 자음과 모음의 조합 가능 개수만 따져도 가뿐히 128개를 넘는다.

 중국어 역시 한자의 개수가 만 개가 넘는데, 이를 어떻게 아스키 코드에 담을 수 있을까?


그래서 용량을 크게 확장한 2byte (2의 16승 = 65536)의 유니코드가 등장하게 되었다.

니코드 3.0버전까지는 2바이트 영역을 가리켜 기본다중언어판(BMP, Basic Multilingual Plane)라고 불렀다.

여기에는 기본 문자가 들어가있다.


처음에는 65536개에 온 세상 문자를 모두 담을 수 있을거라고 생각했지만

쓰지 않는 고어(古語), 아프리카 토속어 등등 모든 문자를 담으려다 하다보니 이마저도 부족했다.


이를 해결하기 위해 유니코드 3.0부터 보충언어판(Supplementary Planes)를 정의했다. 

위에서 언급한 BMP(기본다중언어판, 기존의 2바이트 영역)의 일부를 

상위대행(high surrogates, 1024자), 하위대행(low surrogates, 1024자)로 할당한 뒤

이 둘의 조합으로 1024 x 1024 = 1,048,576 약 백만자가 넘는 문자를 추가로 정의했다.



 한글 2010에서도 유니코드 문자표의 존재를 확인할 수 있다. 정말 특이한 기호도 존재하지 않는가?

 1991년 10월 : 최초 버전 (1.0.0) 발표

 2010년 10월 : 유니코드 6.0

 2014년 6월 : 유니코드 7.0

 2016년 6월 : 유니코드 9.0


<다국어 기본 평면, BMP(Basic Multilingual Plane) >


유니코드에는 총 110만 개가 넘는 코드를 지정할 수 있게 되었는데, 유니코드는 이를 17개 구역으로 나눴다.

왜 17개 구역으로 나눴냐고 물어본다면, 2바이트에 해당하는 65,536으로 110만이라는 숫자를 나눈 것이다.

(그러면 대략 16.78개가 나오게 된다.)


이 구역 하나하나를 '평면(plane)'이라고 부른다. 그래서 0번부터 16번 평면까지 있다고 보면 된다.

아무튼 유니코드는 1개의 기본언어판(BMP)와 16개의 보충언어판(SMP)를 가지고 있다.


위 그림은 17개의 평면 가장 기본이 되는 0번째 평면(BMP)이다. (각 칸은 문자 256개를 담을 수 있다.)

그 다음 1번째 평면은 다국어 보충 평면(SMP)이다. 

17개 평면을 모두 나열하기에는 지면이 제한적이기 때문에 생략하도록 한다.

  

[문자 인코딩 형태]

문자 인코딩 형태(character encoding form, CEF)는 특정한 문자 집합 안의 문자들을 컴퓨터 시스템에서 사용할 목적으로 일정한 범위 안의 정수(코드값)들로 변환하는 방법이다.


여기에는 유니코드 코드 포인트를 8비트 숫자의 집합으로 나타내는 UTF-8이나, 16비트의 숫자의 집합으로 나타내는 UTF-16 등이 포함된다.










ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

참고주소

http://www.kristalinfo.com/K-Lab/unicode/Unicode_intro-kr.html