[출처] http://d2.naver.com/helloworld/19187

한글을 이용하여 프로그래밍을 할 경우 가끔씩 Terminal 화면에서 원하는 한글의 모양이 나오지 않는 경우가 있습니다.
이러한 경우를 해결하기 위해 한글 인코딩에 대한 기본적인 내용을 알아봅시다.

1) 문자 집합과 인코딩

  컴퓨터 발명 초기에는 문자를 표현해야하는 요구가 없었으나 세월이 흘러 컴퓨터 간에 문자 데이터를 교환해야할 필요성이 생겼고 이러한 이유로
ASCII (American Standard Code for Information Interchange)와 같은 표준 문자 인코딩이 만들어졌습니다. 
  표현해야 할 문자를 정하고 순서를 지정한 문자 집합을 코드 형태로 표기한 것을 코드화된 문자 집합 (CSS, Coded Character Set)이라고 하며 이러한 문자집합을 컴퓨터에 저장하기 위해 8bit 단위의 형태로 표현한 것을 인코딩 방식 (CES, Character Encoding Scheme)이라고 합니다.

2) 영어의 문자 집합과 인코딩

  ASCII는 0x00부터 0x7F까지의 총 127개 문자(제어 문자, 특수 문자, 숫자, 알파벳 등)로 이루어져 있습니다. 이는 영어 알파벳을 표현하기위한 것으로 이후 유럽어를 사용하기 위한 Extended ASCII를 제정하였고 이는 0x80 ~ 0xFF (128번 ~ 255번까지)의 새로운 문자를 정의하였습니다. 이 Extended version은 ISO-8859 유럽 통일 표준안으로 제정되었습니다.

3) 한글의 문자 집합과 인코딩

  중국, 일본, 한국 (CJK, Chinese-Japanese-Korean)에서 사용하는 문자 집합은 개수가 많아 Extended ASCII로 처리할 수 없습니다. 따라서 별도의 방안이 마련되었으며 한글을 표현하는 방법에는 크게 조합형과 완성형으로 나눌 수 있으며 조합형이란 한글의 제자 원리에 기반하여 초성, 중성, 종성에 각각 코드를 할당하는 방식이고, 완성형이란 완성된 문자에 코드를 할당하는 방식이며 이 중 완성형이 한글 표준안으로 채택뙤었으며 유니코드의 한글 표현 방식에도 완성형이 채택되었습니다. 조합형과 완성형의 여러 가지 방식을 소개하면 다음과 같습니다.

3-1) N 바이트 조합형

  최초의 한글 표현 방식으로 대형 컴퓨터에서 단말기를 이용하여 한글을 표현하는 데 사용되었습니다. 이 방법은 각각의 개별적인 한글 자모를 영문자에 각각 대응시키고, 시작과 끝에 SI (Shift In, ^N)와 SO (Shift Out, ^O)을 추가하여 한글과 영어를 구분하는 방식입니다.

3-2) 3 바이트 조합형

  초성, 중성, 종성에 1바이트씩 할당하여 사용하는 방식입니다. 단, 중성과 종성이 없는 글자를 위해 채움 문자(fill code)를 정의하고 있습니다.

3-3) 7비트 완성형

  소문자 뒤에 대문자가 오는 경우가 거의 없고, 특수 문자 뒤에 영문자가 오는 경우가 거의 없다는 점에서 착안하여 고안한 방식입니다. 즉, 처음 1바이트가 소문자이거나 특수 문자이고, 그 다음 1바이트가 대문자이면 한글로 표현합니다.

3-4) 2바이트 조합형

  초성, 중성, 종성에 각각 5비트씩 할당하고, 처음 1비트 (MSB, Most Significant Bit)는 1로 설정하여 한글임을 표시하는 방식입니다.

3-5) 2바이트 완성형

  완성된 음절을 코드와 일대일 대응시키는 방식입니다. ISO 2022 표준을 기준으로 하였으며, KS C 5601:1987 표준안으로 채택되었습니다. 이 방식은 ASCII 영역과 겹치지 않도록 첫번째 비트 값을 1로 규정하여 총 8,836 글자를 사용하였습니다. 이 중 한글에는 2,350자 밖에 사용하지 못해 모든 완성형을 다룰 수는 없는 문제점이 발생하였습니다.
  현재는 KS C 5601은 KS X 1001로, KS C 5636은 KS X 1003으로 변경되었습니다.

3-6) 확장완성형
  Microsoft가 독자적으로 제정한 문자 집합으로 완성형 코드에서 표현할 수 없었던 8,822자가 추가되었습니다. 통합형 한글 코드 (UHC, Unified Hangul Code)라고도 하며, 현대 한글을 모두 표현할 수 있습니다.

4) 한글의 인코딩 방식

  EUC-KR은 KS X 1001과 1003 표준안의 인코딩 방식으로 2,350자의 한글을 표현할 수 있습니다. CP949(MS949, x-windows-949)는 확장 완성형의 인코딩 방식으로 11,172자의 한글을 표현할 수 있습니다. 

5) 유니코드

  각 나라마다 컴퓨터에서 해당 언어를 표현할 수 있는 독자적인 문자 집합이 있으나 문제는 '어떻게 동시에 여러 나라의 문자를 표현하는 가' 이다. 이러한 문제를 해결하기 위해 전 세계적으로 사용되는 모든 문자 집합을 하나로 모아 탄생시킨 것이 유니코드이다. ISO 10646 표준에서 UCS (Universal Character Set)을 정의하고 있다. 
  유니코드 값을 나타내기 위해서는 코드 포인트 (Code Point)를 사용하는데, 보통 +U를 붙여 표시한다. 유니코드는 공식적으로 31비트 문자 집합이며 논리적으로 평면 (Plane)이라는 개념을 이용하여 구획을 나누며, 기본 다국어 평면 (BMP, Basic Multilingual Plane)인 0번부터 16번까지 총 17개의 평면으로 구성되어있다. 한글은 U+1100 ~ 11FF 사이에 한글 자모 영역, U+AC00 ~ U+D7AF 사이의 한글 소리 마디 영역에 포함된다.

6) 유니코드 인코딩 방식

  유니코드의 인코딩 방식으로는 코드 포인트를 코드화한 UCS-2와 UCS-4, 변환 인코딩 방식 (UTF, UCS Transformation Format)인 UTF-7, UTF-8, UTF-16, UTF-32 인코딩 등이 있으며 이 중 ASCII와 호환이 가능 (UTF-8의 영문과 ASCII의 영문영역에서 호환)하면서 유니코드를 표현할 수 있는 UTF-8 인코딩이 가장 많이 사용된다. 
  한글 완성형의 코드 포인트 범위는 U+AC00 ~ U+D7AF이므로, UTF-8 인코딩에서 한글은 3바이트 인코딩입니다. 

이상 한글 인코딩에 대한 기본 지식에 대한 요약 정리였습니다 !

profile