본문 바로가기

Academy I/IT

한글/유니코드 인코딩에 대한 완전한 이해 [Euc-KR, CP949, UTF-8]

델마당 : 챨리브라운(권광일)



다음의 내용은 본인이 한글을 지원하는 여러 장비와 연동작업을 하면서 힘들었던

한글호환 문제를 해결하기 위해 직접 정리한 자료입니다.

여러분에게 도움이 되었으면 하는 바람에서 팁정보로 올립니다.

제가 잘못 이해 했거나 틀린 부분이 있으면 알려 주시면 수정토록 하겠습니다.


[용어정리]

한글 - 완성형 코드 : 한글 한글자 한글자에 해당하는 코드표를 만들어 1:1 맴핑
                     하여 글자를 찾는 방식 (논리성 없음)

        전세계 문자가 한글처럼 과학적으로 만들어 지지 못하고
     그림형태로 만들어진 문자가 많기 때문.


한글 - 조합형 코드 : 논리적 코드생성

변환단계 1 - 기본 초성, 중성, 종성 코드표만을 사용하여 코드 검색

예) 장 
ㅈ 01110 +
ㅏ 00011 +
o 10111 +

변환 단계 2 : 01110(5bit) + 00011(5bit) + 10111(5bit) 합성( 총 15bit )
변환 단계 3 : 1+ 01110(5bit) + 00011(5bit) + 10111(5bit) 합성( 최종 총 16bit 생성)
변환 단계 2 제일 선두에 1 추가 해서 16bit (2byte) 문자코드 생성

한글학회 한글창시의 과학적 우수성을 살리기 위해 조합형이 한글 표준으로 
                채택되어야 한다고 주장. (순수 초성,중성,종성 의 조합법을 강조 )

한국인 입장에서는 맞는 말이지만 전세계 언어 규격화 입장에서 봤을때 
                한글만 예외를 둘 수 없어서 MS 는 한글 완성형 방식을 우선적으로 사용 


인코딩

       -문자를 컴퓨터에 저장하거나 통신으로 전송할 목적으로 부호화 하는 방법을 가리킨다.


유니코드란 ?

      우리는 흔히 유니코드라 함은 문자를 2byte 로 인코딩 하는 기법이라 알고 있다.

      아래 Euc-KR과 CP949 의 요약내용을 보면 알겠지만 이 둘은 모두 2byte 처리기법을
      사용하고 있다.

      그럼 과연 Euc-KR과 CP949 를 유니코드라 명명할 수 있는가?

      답은 안된다 이다. 이유는 다음과 같다.

      유니코드란 이름에서 알수 있듯 전세계 모든 문자를 하나의 코드표로 통합시킨 개념이다.
      즉, 유니코드 안에는 전세계 모든 언어의 문자가 들어 있어야 한다는 대 전제가 있다.

      하지만, Euc-KR 과 CP949 안에는 통상문자(영어, 특수문자) 와 한글 밖에는 없다.
      그러므로 Euc-KR 과 CP949 를 가지고 유니코드란 표현을 쓰면 안된다.

      그러므로 우리는 전세계 모든 문자를 표현 할 수 있는 인코딩인 UTF 를 유니코드라 할 수 있다.     

ACSII 인코딩

      -128 개의 문자코드 정리표로 오직 1byte 인코딩

      -영어, 통상 특수문자만 표현가능

      -한글 및 기타 외국어 표현 안됨


Euc-KR 인코딩 ( Extended Unix Code Page)

      -완성형 코드페이지

      -유닉스 계열의 코드페이지 

      -가변길이 방식의 영어, 특수문자, 한글, 일부한자 만 표현가능
  
       통상문자  (영어.특수문자)   일 경우 1 Byte KS X 1003 코드표 참조 (1Byte)
       한글                        일 경우 2 Byte KS X 1001 코드표 참조 (2Byte)

      - 2,350 자의 한글 표현 가능

      -ISO/IEC 2022 표준 
     

CP949  인코딩 ( Extended Windows Code Page )

       -확장 완성형 코드 페이지 / Euc-KR 과 호환 됨)
        완성형 코드표에 없는 한글 글자를 조합형으로 처리하는 로직을 가지고 있음

       -윈도우 계열의 코드 페이지 

       -가변길이 방식의 영어, 특수문자, 한글, 일부한자 만 표현가능

       통상문자  (영어.특수문자)   일 경우 1 Byte KS X 1003 코드표 참조 (1Byte)
       한글                        일 경우 2 Byte KS X 1001 코드표 참조 (2Byte)
       
       그외 조합형 병행 사용 

       11,172 자의 한글 표현 가능

       -Euc-KR보다 많은 한글 수 표현 가능

       -CP949 에서 Euc-KR 로 변환이 잘 안될 경우의 원인 :
CP949 가 Euc-kR 보다 더 많은 문자조합의 경우 수를 가지고 있기 때문

       -Euc-KR 를 따라한 개념으로 ISO/IEC 2022 표준 채택은 안되어 있음.

       -델파이 한글 표기에 사용


UTF-8 인코딩 (유니코드)
   
      -유닉스/윈도우 양쪽 계열 모두에서 사용되는 확장 완성형 코드 페이지 

      -전 [ 세계 모든 문자 코드 페이지 ] 포함

      -가변길이 문자 인코딩 방식
  
      -통상문자 (영어.특수문자)    일 경우 1Byte 사용
       ASCII 코드 1 Byte 로 표현 (그러므로 ASCII 코드는 UTF-8의 일부분이다.) 

      -Euc-KR 과 CP949 코드표와 호환성 없음

       UTF-8 내부 저장방식을 보면 

       한 문자를 표현/저장하기 위해 최소 1byte 에서 최대 4 byte 까지 동적으로 사용한다.
       (다른 문자는 다른 바이트 수로 표현 될 수 있다.)
       
      1Byte 의 최상위 4bit 에  문자기록에 사용되는 byte 수 기록

      문자기록에 필요한 byte 수가 1byte 일 경우 최상위 bit 는 0 으로 시작
      문자기록에 필요한 byte 수가 2byte 일 경우 최상위 bit 는 110  으로 시작
      문자기록에 필요한 byte 수가 3byte 일 경우 최상위 but 는 1110 으로 시작
      문자기록에 필요한 byte 수가 4byte 일 경우 최상위 but 는 1111 으로 시작

      ASCII 는 1byte 사용, 한글은 무조건 3byte 인코딩이다.

      즉 내부적으로 봤을때 유니코드는 무조건 2byte 처리란 말은 완전히 틀린 개념이다.
      이 말을 어느 누가 제일 먼저하고 전파시킨 지는모르겠으나 유니코드가 2byte 란 개념은
      완전히 잘못된 개념이니 지금 부터는 올바르게 이해하기 바란다.

      UTF-8 은 한글 문자에 무조건 2byte 코드표를 참조하는 Euc-KR 과 CP949 와는 완전히 다른 개념이다.

      -2014년 현재 1,114,112 개의 글자 표현 가능 ( 매년 지속적인 버젼업으로 글자수 추가중 )


UTF-16/UTF-32

UTF-8   A라는 문자표현을 0x41                  1Byte 로 표현함

UTF-16  A라는 문자표현을 0x0041/0x4100         2Byte 로 표현함
                (Little-Endian/Big-Endian 닭이 먼저냐 알이 먼저냐)

UTF-32  A라는 문자표현을 0x00000041/0x41000000 4byte 로 표현함
                (LE/BE 닭이 먼저냐 알이 먼져냐)

        컴파일러에 따라 Little-Endian 인지 Big-Endian 인지를 가리기 때문에
        이 옵션이 추가 된 것 같다.

        유니코드(Little-Endian)

        유니코드(Big-Endian)


지금까지 정리한 내용은 이렇습니다. 보다 좋은 정보 추가해 주실 분 있으시면 
말씀해 주시면 다시 정리해 보겠습니다.



https://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&indx=453819&page=2