ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 컴퓨터가 한글을 이해하는 과정. 근데 이제 유니코드와 UTF-8을 곁들인
    일찍 알았으면 좋았을 넓고 얕은 개발 지식 2025. 1. 19. 23:15

    컴퓨터는 숫자만 다루던 계산기였어요

    최초의 전자식 컴퓨터인 에니악(ENIAC)은 이름부터 전자식 숫자 적분 및 계산기 (Electronic Numerical Integrator And Computer) 였습니다. 포탄의 탄도학 계산을 위해 발명되었던 최초의 계산기는 30톤에 달하는 거대한 톱니바퀴로 이루어진 쇳덩이였습니다. 최초의 컴퓨터는 문자 입출력이 불가능했어요. 

    ENIAC


    숫자와 문자를 처리할 수 있는 컴퓨터는 UNIVAC I(UNIVersal Automatic Computer I)이 시작이었어요. IBM이 비지니스 환경을 위해 설계한 미국 인구조사국에서 사용된 최초의 상업용 컴퓨터 이기도 합니다. 그리고 1963년 컴퓨터간 데이터 교환을 위한 최초의 표준화된 문자 인코딩 방식인 ASCII (American Standard Code for Information interchage)가 제정되었습니다. ASCII 코드는 영문, 알파벳을 사용하는 대표적인 문자 인코딩입니다. 

    UNIVAC i & ASCII TABLE

    인코딩은 정보를 특정한 규칙에 따라 다른 형태로 변환하는 과정.

    인코딩이란 어떤 정보를 정해진 규칙에 따라 다른 형태로 변환하는 것을 말합니다. 컴퓨터의 세계에서는 모든 정보가 결국 숫자로 표현되어야 하기 때문에, 문자를 숫자로 변환하는 과정이 필요합니다. 예를 들어, 영문자 'A'는 ASCII 인코딩에서 65라는 숫자로 표현됩니다. 이것은 마치 암호를 만드는 것과 비슷한데, 'A'는 65, 'B'는 66, 'C'는 67과 같이 각 문자에 고유한 숫자를 할당하는 것입니다.
    문자 인코딩 이외에도, 이미지, 오디오, URL, http 통신 등등에도 다양한 인코딩이 있습니다.

    김?주세요

    영문과 숫자만 다루던 컴퓨터 문자 체계가 글로벌로 확대되면서 국내에도 컴퓨터가 도입되었습니다. 한글은 초성, 중성, 종성에 각각 코드를 할당하는 조합형과, '가', '각' 같은 완성된 음절에 코드를 할당하는 완성형으로 두 가지 방식으로 컴퓨터에 입출력이 가능했습니다. 

    둘 중에 완성형인 KS C 5601이 국가 표준이 되었고, 이는 현대 한글에서 자주 사용되는 2,350자를 선별하여 표준화했습니다. 이 표준을 기반으로 유닉스 시스템에서 사용하기 위한 EUC-KR 인코딩이 만들어졌습니다. 따라서 2,350자에 포함되지 않는 '뷁'과 같은 글자들은 표현할 수 없었습니다. 

     

    만약, 지정된 2350자 이외의 글자를 처리하는 상황이 생기면 어떤일이 일어날까요.

    배달 서비스에서 사용되는 포스 프린터는 임베디드 시스템으로, 문자 인코딩이 하드웨어에 내장되어 있습니다. 이러한 프린터 중 EUC-KR 인코딩을 사용하는 경우, 흥미로운 문제가 발생할 수 있습니다. 예를 들어, 고객이 '김뺴주세요'라는 요청을 했을 때, '뺴'라는 글자가 EUC-KR에서 지원하지 않는 문자였기 때문에 '김?주세요'로 출력된 사례가 있었습니다. 


    마이크로소프트는 이런 제한을 해결하기 위해 CP949라는 새로운 인코딩 방식을 개발했고, EUC-KR의 모든 문자를 포함하면서도 추가적인 한글 음절을 지원하도록 확장한 것으로, Windows 95에 탑재되었습니다. 
    정리하면, EUC-KR은 KS X 1001(구 KS C 5601)과 KS X 1003(구 KS C 5636) 표준을 유닉스 시스템에서 구현한 인코딩 방식이고, CP949는 이를 확장하여 더 많은 한글 음절을 표현할 수 있도록 한 인코딩 방식입니다.

    Codepage 949

    세계 각국의 독자적 인코딩 체계 구현

    초기 ASCII는 영어 알파벳과 기본 기호만을 다룰 수 있었기 때문에, 다른 언어를 사용하는 나라들은 각자의 방식으로 이 문제를 해결해야 했습니다. 유럽의 경우도 예외가 아니었는데, 독일어의 'ß'(에스체트)나 프랑스어의 'é'(악상 부호가 있는 e), 스페인어의 'ñ'(엔예) 같은 문자들은 ASCII로는 표현할 수 없었습니다. 이에 유럽은 ISO-8859 시리즈를 개발했습니다. 서유럽 언어를 위한 ISO-8859-1(Latin-1), 중부 유럽 언어를 위한 ISO-8859-2 등 지역별로 서로 다른 인코딩을 사용한 것입니다.

    동아시아에서도 자국의 문자를 표현하기 위한 노력이 있었습니다. 중국은 GB2312를, 일본은 EUC-JP와 같은 독자적인 인코딩을 개발했습니다. 이처럼 각 국가는 자신들의 문자를 컴퓨터에서 표현할 수 있는 독자적인 문자 집합을 가지게 되었습니다.

    하지만 이러한 방식에는 큰 한계가 있었습니다. 하나의 문서에서 서로 다른 문자 집합을 동시에 사용할 수 없었기 때문입니다. 예를 들어, 한글과 영어, 일본어를 하나의 문서에서 함께 표현하는 것은 불가능했습니다. 지금은 당연하게 여겨지는 이러한 기능이 1990년대 초중반까지는 실현되지 못했던 것입니다.

    유니코드의 탄생

    이러한 문제를 해결하기 위해 탄생한 것이 바로 유니코드입니다. 앞서 다뤘던 문자 집합의 문제를 해결하고자 1991년 처음 발표되고, 최신버전은 2024년 9월 12일에 발표된 16.0 입니다. 한글은 최종적으로 1996년에 11,172자 모두 U+AC00~D7A3 영역으로 배치되었습니다.유니코드는 각각의 문자에 특정 값이 매핑되어있는데 이걸 코드포인트 라고 합니다. 유니코드에서 한글은 5가지 영역으로 구분되어있습니다.


    한글 소리마디(음절) - 완성형 한글(Hangul Syllables)
    한글 자모 - 조합형 한글 (Hangle Jamo)
    호환용 한글 자모(Hangul Compatibility Jamo)
    한글 자모 확장 A (Hangul Jamo Extended A)
    한글 자모 확장 B (Hangul Jamo Extended B)

     

    한글 소리마디(음절)

    한글 소리마디는 초성,중성,종성이 결합되어있는 음절 입니다. 완성형 이라고도 합니다. "가","핳","팥" 같은 음절로 한글에서 표현 가능한 11,172자 모두 포함되어있습니다. 모든 글자가 AC00부터 D7A3까지 영역에 매핑 되어 있습니다.

    한글 음절 (완성형)

     

    한글 자모,호환용 한글 자모

    한글 자모, 호환용 한글 자모는 첫가끝 코드 혹은 조합형 이라고도 불립니다. 초성, 중성, 종성이 분리되어 각각 코드가 매핑되어있습니다. 그래서 초성"ㄱ"과 종성"ㄱ"의 코드가 다르고,  조합형 한글을 표현할 수 있습니다. "ㅋㅋㅋㅋ"처럼 자음만 반복해서 쓰는 현대적인 표현에는 호환용 자모가 필요합니다.

    한글 자모(초정,중성,종성)
    한글 호환용 자모

     

    한글 자모 확장 A,B

    한글 자모 확장 A,B는 옛 한글의 초성,중성,종성을 표현하는데 사용되고, 현대 한글에서는 사용되지 않는 문자들이지만 고문서 디지털화, 학술연구 등의 옛 한글을 연구하는 용도로도 사용이 가능합니다.

     

    유니코드 인코딩 UTF-8

    유니코드는 전 세계의 모든 문자에 고유한 숫자(코드 포인트)를 부여한 표준입니다. 하지만 이 유니코드를 컴퓨터에 저장하려면 실제 비트와 바이트로 변환해야 하는데, 이때 사용하는 방식이 UTF-8입니다.

    UTF-8의 특별한 점은 문자에 따라 사용하는 바이트 수가 다르다는 것입니다:

    • 영어와 숫자는 1바이트면 충분합니다
    • 한글이나 한자같은 복잡한 문자는 3바이트를 사용합니다
    • 이모지와 같은 특수 문자는 4바이트까지 사용할 수 있습니다

    코드포인트별 UTF-8 표현

    그래서 컴퓨터가 한글을 이해하려면?

    한글 '가'를 컴퓨터가 이해할 수 있는 형태로 변환하는 과정을 단계별로 살펴보겠습니다.

    1. 먼저, 모든 문자는 유니코드 체계에서 고유한 코드 포인트를 가지고 있습니다. '가'라는 문자는 유니코드에서 U+AC00이라는 코드 포인트를 가집니다. 이 AC00은 16진수로 표현된 값인데, 이를 컴퓨터가 이해할 수 있는 2진수로 변환하면 다음과 같습니다:

    A(10) = 1010
    C(12) = 1100
    0 = 0000
    0 = 0000

    따라서 '가'의 2진수 표현은 1010 1100 0000 0000이 됩니다.

     

    2. 한글은 유니코드 코드 포인트 000800-00FFFF 영역에 속하는데, 이 영역의 문자들은 UTF-8 인코딩에서 3바이트로 표현됩니다. UTF-8의 3바이트 패턴은 다음과 같습니다:

    1110xxxx 10xxxxxx 10xxxxxx

    이 패턴에 따라 앞서 구한 2진수를 재배치하면:

    첫 번째 바이트: 1110 1010 두 번째 바이트: 1011 0000 세 번째 바이트: 1000 0000

    이렇게 변환된 3바이트 형태가 최종적으로 컴퓨터가 이해하고 처리할 수 있는 형태가 됩니다.

Designed by Tistory.