Unicode 완성형 - 조합형 변환과 Unicord 한글 조합형의 표현형

현행 한글의 표준은 완성형이지만, 과거에는 조합형과 완성형이 서로 표준자리를 놓고 다투었기에 Unicode에는 조합형의 흔적도 있어요. 물론 지금은 일부 레거시 시스템이나 임베디드 프로그래밍이 아니면 거의 사용할 곳이 없기는 하지만, 그렇다고 해도 조합형 또한 사용할 수 있도록 표준이 제정되있기는 하더라구요.

한글 완성형은 말 그대로 모든 글자가 각각 하나의 코드로 정의되어 있어서 해당하는 글자를 치면 자동적으로 해당하는 입력이 들어가는 것을 말하구요.
한글 조합형은, 글자가 아닌 각각의 낱말에 다른 코드가 부여되어 있어 글자를 치면 해당하는 코드가 입력되는 한글 인코딩(표현)방식이에요.

조합형이 무엇인가에 대해서는
https://ko.wikipedia.org/wiki/%ED%95%9C%EA%B8%80_%EC%A1%B0%ED%95%A9%ED%98%95_%EC%9D%B8%EC%BD%94%EB%94%A9
에 간략하게 표현되어 있구요.

한글 유니코드표는 16진수를 사용하고 있으며, 많은 사이트나 브라우저에서는 자동적으로 완성형으로 변환해서 표현해주기도 하며, 일부 임베비드 시스템에서는 용량이나 처리 문제로 인해 조합형을 사용해야 할 때도 있지요 ㅎㅎ

그 표는

이런 형상을 띄구요. Number는 순서를, character reference는 해당 기호를 나타내는 기본값을 말해요.


이를 이용해서 관련 변환 코드를 짜 보기도 했는데요.
이 코드를 이용하면, 단어를 해당하는 조합형 문자열로 쉽게 바꿔서 이용하실 수 있어요 ㅎㅎ
# -*- coding: utf-8 -*-
import re

# 유니코드 한글 시작 : 44032, 끝 : 55199
BASE_CODE, CHOSUNG, JUNGSUNG = 44032, 588, 28

CHAR_List = []
count = 1;



# 초성 리스트. 00 ~ 18
CHOSUNG_LIST = ['ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']

# 중성 리스트. 00 ~ 20
JUNGSUNG_LIST = ['ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ']

# 종성 리스트. 00 ~ 27 + 1(1개 없음)
JONGSUNG_LIST = [' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ']


if __name__ == '__main__':
    test_keyword = input("문자를 입력하세요: ")
    split_keyword_list = list(test_keyword)
    print(split_keyword_list)

    result = list()
    for keyword in split_keyword_list:
        
        #초성 중성 종성 넘버링
        BASE_CHO_NUMBER = 4352
        BASE_JUNG_NUMBER = 4449
        BASE_JONG_NUMBER = 4519
        
        # 한글 여부 check 후 분리
        if re.match('.*[ㄱ-ㅎㅏ-ㅣ가-힣]+.*', keyword) is not None:
            char_code = ord(keyword) - BASE_CODE
            char1 = int(char_code / CHOSUNG)
            result.append(CHOSUNG_LIST[char1])
            BASE_CHO_NUMBER = BASE_CHO_NUMBER + char1


            CHAR_List.insert(count, "&#x"+hex(BASE_CHO_NUMBER)[2:])
            count = count +1;
            print('초성 : {}'.format(CHOSUNG_LIST[char1]))

            
            char2 = int((char_code - (CHOSUNG * char1)) / JUNGSUNG)
            result.append(JUNGSUNG_LIST[char2])
            BASE_JUNG_NUMBER = BASE_JUNG_NUMBER + char2
            
            CHAR_List.insert(count, "&#x"+hex(BASE_JUNG_NUMBER)[2:])
            count = count +1;
            print('중성 : {}'.format(JUNGSUNG_LIST[char2]))


            
            char3 = int((char_code - (CHOSUNG * char1) - (JUNGSUNG * char2)))
            result.append(JONGSUNG_LIST[char3])
            BASE_JONG_NUMBER = BASE_JONG_NUMBER + char3
            if char3 is 0:
                BASE_JONG_NUMBER = 0000
            CHAR_List.insert(count, "&#x"+hex(BASE_JONG_NUMBER)[2:])
            count = count +1;
            print('종성 : {}'.format(JONGSUNG_LIST[char3]))

        else:
            result.append(keyword)
    # result
    print("Unicode 단어 -> Unicode 조합형 문자열로 변환한 결과")
    print(CHAR_List)
    print("".join(result))
    exit = input("")#바로 안꺼지고 종료 시 입력을 받도록
   
위의 코드를 이용하여 돌리면
이런 식으로 결과가 나옵니다. [&#x0]은 값이 없는 것이구요.



완성형 한글 코드표 참고 http://kkamagui.tistory.com/234

과거 1990년대에는 조합형과 완성형이 한글 표준자리를 놓고 경쟁하기도 하였는데요.
관련해서는 
를 참고해 보시는 게 좋을 듯 싶네요.



댓글 없음:

댓글 쓰기

글에 대한 의문점이나 요청점, 남기고 싶은 댓글이 있으시면 남겨 주세요. 단 악성 및 스팸성 댓글일 경우 삭제 및 차단될 수 있습니다.

모든 댓글은 검토 후 게시됩니다.

Translate