컴퓨터가 발명되고 긴 시간 동안 발전하면서 언어를 컴퓨터로 처리하는 방식이 필요했었다. 우리 일상의 언어를 처리하기 위한 연구가 서양권에서 먼저 시작이 되면서 알파벳 처리에 대한 연구가 가장 먼저 시작이 됨. 이후 세계적으로 컴퓨터 시장이 커지게 되면서 다른 국가의 언어도 처리할 필요가 느껴지면서 끊임없이 연구가 진행이 되어왔다.
영어의 문자 집합과 인코딩
최초의 컴퓨터인 에니악이 만들어진 이루 약 15년이 지나서야 문자 집합이라는 개념이 생김. 시초는 아스키(ASCII)인데 이는 0x00 ~ 0x7F까지 총 127개 문자로 이루어져있음. 이는 영어를 표현하는 데 있어 큰 문제가 없었지만, 유럽 언어를 표현하는데 사용할 수 없었다.
이러한 문제를 해결하기 위해 ASCII를 제정하여 기존 127개에서 0x80 ~ 0xFF까지 확장하여 프랑스어, 독일어 등을 표현할 수 있게 하였다.
한글의 문자 집합과 인코딩
이렇게 만들어진 256개의 문자는 서양 국가의 언어를 표현하는데 문제가 없었는데, 시대가 지나면서 중국과 일본, 한국의 언어 표현 체계가 필요해지기 시작했다. 그러나 동아시아 국가의 언어는 256개로 처리할 수 없을 만큼 많은 양을 내포하고 있었고 이 세 나라의 문자를 처리하기 위한 별도의 방안이 필요했다.
그 중에서 한글을 표현하는 방법에는 크게 두 가지가 있었는데 __조합형__과 __완성형__이다. 이를 좀더 세분화 하게 되면 N byte 조합형, 3 byte 조합형, 7 bit 완성형, 2 byte 조합형, 2 byte 완성형으로 나눌 수 있다.
조합형이란 한글의 제자 원리에 기반하여 초성 / 중성 / 종성에 각각 코드를 할당하는 방식이고, 완성형은 '가', '각' 같은 완성된 하나의 문자에 코드를 할당하는 방식이다. 이 중 완성형이 한글 표준안으로 채택되었고, 이후 유니코드의 한글 표현 방식에도 완성형이 먼저 채택 되었다.
N bytes 조합형
유럽어만 표시할 수 있었던 컴퓨터에서 한글을 표시하기 위한 고육지책으로 고안된 최초의 한글 표현 방식이다. 이 방식은 대형 컴퓨터에서 단말기를 이용하여 한글을 표현하는 데 사용되었다. N bytes 조합형은 각각의 개별적인 한글 자모를 영문자에 1:1 대응하여 시작과 끝에 SI(Shift In), SO(Shift Out)을 추가하여 한글과 영어를 구문하는 방식
아래 표는 N byte 조합형의 한글 / 알파벳 mapping 규칙이다.
자음 | 모음 | ||
ㄱ | A | ㅏ | b |
ㄲ | B | ㅐ | c |
ㄴ | D | ㅑ | d |
ㄷ | G | ㅒ | e |
ㄸ | H | ㅓ | f |
ㄹ | I | ㅔ | g |
ㅁ | Q | ㅕ | j |
ㅂ | R | ㅖ | k |
ㅃ | S | ㅗ | l |
ㅅ | U | ㅛ | r |
ㅆ | V | ㅜ | s |
ㅇ | W | ㅠ | w |
ㅈ | X | ㅡ | z |
ㅉ | Y | ㅣ | | |
ㅊ | Z | ||
ㅋ | [ | ||
ㅌ | \ | ||
ㅍ | ] | ||
ㅎ | ^ |
3bytes 조합형
초성 / 중성 / 종성에 각각 1 byte 할당하여 사용하는 방식. 3bytes 조합형은 80년대 개인용 컴퓨터에서 사용이 되었다. 단지 중성과 종성이 없는 글자를 위해 채움 문자를 정의하고 있다. N bytes 조합형이 2 ~ 5 bytes를 이용하는데 반해, 3 bytes 조합형은 3 bytes로 표현
7bits 완성형
별명이 청계천 한글이다. 소문자 뒤에 대문자가 오는 경우가 거의 없고, 특수 문자 뒤에 영문자가 오는 경우가 거의 없다는 점에 착안하여 고안한 방식. 즉, 처음 1 byte가 소문자 이거나 특수 문자이고, 그 다음 1byte가 대문자이면 한글로 표현. 글자 표현이 1300여자 정도로 제한된다는 점과 일부 영어 단어가 한글로 표시되는 문제가 있음
표현 글자 수는 적지만 당시 많이 사용했던 혀큘리스 그래픽 카드를 확장하여 만들어진 기능이라 8090 시절 작업 처리 속도를 지연하지 않는 유일한 방식이었음. 덕분에 어느 정도 수요가 있었다.
2 bytes 조합형
초성 / 중성 / 종성에 각 5 bytes를 할당하고, MSB(most significant bit)는 1로 설정하여 한글임을 표시하는 방식. 대우, 삼보 등의 여러 회사에서 각각의 조합형 방식을 제안했지만, 결국 승자는 삼보
아래 표는 2 bytes 조합형의 한글 mapping 규칙
비트 조합 | 초성 | 중성 | 종성 |
00001 | 채움 | 채움 | |
00010 | ㄱ | 채움 | ㄱ |
00011 | ㄲ | ㅏ | ㄲ |
00100 | ㄴ | ㅐ | ㄳ |
00101 | ㄷ | ㅑ | ㄴ |
00110 | ㄸ | ㅒ | ㄵ |
00111 | ㄹ | ㅓ | ㄶ |
01000 | ㅁ | ㄷ | |
01001 | ㅂ | ㄹ | |
01010 | ㅃ | ㅔ | ㄺ |
01011 | ㅅ | ㅕ | ㄻ |
01100 | ㅆ | ㅖ | ㄼ |
01101 | ㅇ | ㅗ | ㄽ |
01110 | ㅈ | ㅘ | ㄾ |
0111 | ㅉ | ㅙ | ㄿ |
10000 | ㅊ | ㅀ | |
10001 | ㅋ | ㅁ | |
10010 | ㅌ | ㅚ | |
10011 | ㅍ | ㅛ | ㅂ |
10100 | ㅎ | ㅜ | ㅄ |
10101 | ㅝ | ㅅ | |
10110 | ㅞ | ㅆ | |
10111 | ㅟ | ㅇ | |
11000 | ㅈ | ||
11001 | ㅊ | ||
11010 | ㅠ | ㅋ | |
11011 | ㅡ | ㅌ | |
11100 | ㅢ | ㅍ | |
11101 | ㅣ | ㅎ |
2 bytes 완성형
완성된 음절을 코드와 1:1 대응시키는 방식. 예시로, '가'는 0xB0A1, '각'은 0xB0A2로 코드화한다. ISO 2022 표준을 기준으로 하였으며, KS C 5601:1987 표준안으로 채택되었다. ISO 2022 표준은 ASCII 영역과 겹치지 않도록 첫 번째 bit 값을 1로 규정하였으므로, KS C 5601 표준안은 0xA1A1부터 0xFEFE까지의 영역(94x94, 8,836글자)만을 사용하였다. 게다가 다른 국가 언어와 나눠 가지게 되면서 한글은 2350자 밖에 사용할 수 없었다. 2 bytes 완성형의 문제는 1990년에 방영된 "똠방각하"라는 드라마 제목에서 "똠"을 표현하지 못하면서, 한글의 제자 원리를 무시한 방식이라는 비판을 받음
이를 해결하기 위해 1992년에 KS C 5601 표준안에 완성형 / 조합형을 모두 표준으로 지정했지만, 표준 조합형은 기존에 사용되던 사용 조합형과 코드가 맞지 않아 거의 사용되지 않았다. 1990년대 초반까지 조합형과 완성형이 모두 사용되었지만, 국가 주도의 프로그램, 운영체제에서 완성형을 기본으로 지원했고, 윈도우 95 에서 확장 완성형이 사용됨으로써 조합형은 사장되었다. 현재는 KS C 5601은 KS X 1001로, KS C 5636은 KS X 1003 으로 변경됨.
KS C 1003 과 ASCII의 차이는 역슬래시와 원화 표현 차이이다.
한글의 인코딩 방식
EUC-KR은 KS X 1001과 KS X 1003 표준안의 인코딩 방식이며, CP949는 확장 완성형의 인코딩 방식으로 EUC-KR은 2350자, CP949는 11172자의 한글을 표현할 수 있음. (그러나 Java에서는 CP949와 MS949를 다르게 취급)
유니코드
한글 뿐 아니라 일본어와 중국어에도 컴퓨터에서 해당 언어를 표현할 수 있는 독자적인 문자 집합이 있다. 문제는 "어떻게 동시에 다양한 국가의 언어를 표현하는냐"이다. 하나의 집합을 사용하는 문서에서는 이를 동시에 표현할 수 없다.
유니코드 값을 나타내기 위해서는 코드 포인트를 사용하는데, U+를 붙여서 표시한다. 유니코드는 공식적으로 31bits 문자 집합이지만 현재까지는 21bits 내로 모두 표현이 가능.
유니코드 인코딩 방식
유니코드의 인코딩 방식은 다양하게 있는데, 그중에서 UTF-8이 ASCII 코드와 호환이 가능하기도 해서 가장 많이 사용된다.
UTF-8 인코딩 방식은 아래의 표와 같다.
<코드 포인트 범위 | 비트 수 | 인코딩 |
U+0000~U+007F | 7 | 그대로 인코딩 |
U+0080~U+07FF | 11 | 110xxxxx 10xxxxxx |
U+0800~U+FFFF | 16 | 1110xxxx 10xxxxxx 10xxxxxx |
U+10000~U+1FFFFF | 21 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx |
'IT 톺아보기 > 이런저런 공부' 카테고리의 다른 글
한글 오토마타 만들기 - 2 (0) | 2023.01.18 |
---|---|
한글 오토마타 만들기 - 1 (1) | 2023.01.18 |
인코딩이란 - 2. base64 Encoding / Decoding (0) | 2023.01.18 |
플로이드-와샬 알고리즘 (0) | 2022.08.09 |
SQLD 끄적임 (0) | 2021.09.12 |