Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 팁&트릭
Delphi Programming Tip&Tricks
[373] 한글/유니코드 인코딩에 대한 완전한 이해 [Euc-KR, CP949, UTF-8]
이도일 [rotoyo] 10266 읽음    2017-08-19 17:05
다음의 내용은 본인이 한글을 지원하는 여러 장비와 연동작업을 하면서 힘들었던

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

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

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


[용어정리]

한글 - 완성형 코드 : 한글 한글자 한글자에 해당하는 코드표를 무식하게 만들어 사용함
               전세계 문자가 한글처럼 과학적으로 만들어 지지 못하고
             그림형태로 만들어진 문자가 많기 때문.


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

        변환단계 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 보다 더 많은 문자조합의 경우 수를 가지고 있기 때문

       -델파이 한글 표기에 사용


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 인지를 가리기 때문에
        이 옵션이 추가 된 것 같다.

지금까지 정리한 내용은 이렇습니다. 보다 좋은 정보 추가해 주실 분 있으시면
말씀해 주시면 다시 정리해 보겠습니다.
오랑캐꽃 [oranke]   2017-08-20 00:48 X
좋은 글 감사합니다.
다만 UTF-8은 이 유니코드를 저장하는 여러 방법중 하나일 뿐, 유니코드 자체라고 표현하기는 어려울 듯 합니다.

유니코드의 개념을 잘 정리한듯한 글이 있어 링크를 걸어봅니다. 도움이 되셨으면 하네요.

http://www.bsidesoft.com/3435
http://www.bsidesoft.com/3496
http://www.bsidesoft.com/3526
이도일 [rotoyo]   2017-08-21 00:36 X
델파이 최신 버젼들이 유니코드로 UTF-16 을 사용합니다.
UTF 를 유니코드라 말할 수 없다면 델파이 최신버젼들이 유니코드를 지원하지
않는다는 말이 됩니다.
kylix [leowiz]   2017-08-21 10:36 X
민성기님 말씀처럼 UTF-8과 유니코드는 다릅니다. UTF-8은 유니코드 인코딩방법중의 하나입니다.

비유해서 표현하자면 유니코드는 한글 자체이고, UTF-8은 조합형, 완성형, euc-kr과 같은 표기법입니다.

이도일 [rotoyo]   2017-08-21 12:32 X
[유니코드 인코딩 방식]과 [유니코드 코드 페이지=유니코드 표] 의 차이를 말씀 하시는 것 같군요.
아뭏든 유니코드 인코딩법의 대세는 UTF 입니다. 그리고 유니코드 인코딩 기술로 아래의 표준이 되어 있는 상태입니다.

UTF-8은 1992년에 X/Open-Uniforum Joint Internationalization Working Group(XoJIG)이 고안하고 1996년에
ISO 및 IEC가 ISO/IEC 10646-1:1993에 대한 개정 2로 승인한 파일 시스템 안전 범용 문자 세트 변환 형식입니다.
이 표준은 Unicode 컨소시엄, 국제 표준 기구 및 국제 전자 윤리 위원회가 Unicode 2.0 및 ISO/IEC 10646-1의 일부로
채택하였습니다.
이도일 [rotoyo]   2017-08-21 12:43 X
간혹, UTF 를 반쪽짜리 유니코드라고 설명하시거나 이해 하시는 분들이 계신데,
국제표준 기구 ISO 의 "Unicode 2.0 및 ISO/IEC 10646-1의 일부 채택" 이란
문구 때문인 것 같습니다. 하지만, 현재 UTF 를 대응할 대안이 없는 상황에서
현재 유니코드 인코딩 방식의 표준은 UTF 일 수 밖에 없습니다.
오랑캐꽃 [oranke]   2017-08-21 13:30 X
너무 좋은 글을 적어주셔서 건저먹을건 참 많은데... 뭔가 미묘해서요...

UTF-8 은 "Universal Coded Character Set + Transformation Format – 8-bit" 의 줄임말 이므로
UTF 라고만 부르시면 곤란합니다. ^^


+ -

관련 글 리스트
373 한글/유니코드 인코딩에 대한 완전한 이해 [Euc-KR, CP949, UTF-8] 이도일 10266 2017/08/19
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.