본문 바로가기

수업정리/Fundamental

[Python] 한글 유니코드

목차

uhangul.py     >     hcompose.py     >     key_hangul.py      >     dcompose.py

초,중,종 담기     초,중,종 입력>글자      한글>16진법         한글>16진법>초,중,종 찾기

 

자음 : 19개

ㄱ - ㅎ : 0x1100 ~ 0x1112

모음 : 21개

ㅏ - ㅣ : 0x1161 ~ 0x1175

받침 : 28개 ( 자음-된소리3개 16 + 이중자음 16개 + 없을 경우 1개)

ㄱ - ㅄ : 0x11A8 ~ 0x11c2

 

한글 syllables : 모든 한글 개수 19 * 21 * (1 + 27) = 11,172 개

가 - 힣 : 0xAC00 ~ 0xD7A3

 

print(all_syllables[:16]) // 16개 출력
print(all_syllables[-4:]) // 맨 뒤 4개 출력
print(len(all_syllables))  // 총 글자 개수
print(0xd7a3+1-0xac00)  // 총 글자 개수

 

한글 초성,중성,종성을 저장해두고 list 로 나누어놓기

나중에 유니코드로 사용할 것임

#uhangul.py

#coding:utf-8

first_letters=list('ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ')
middle_letters='ㅏ,ㅐ,ㅑ,ㅒ,ㅓ,ㅔ,ㅕ,ㅖ,ㅗ,ㅘ,ㅙ,ㅚ,ㅛ,ㅜ,ㅝ,ㅞ,ㅟ,ㅠ,ㅡ,ㅢ,ㅣ'.split(',')
final_letters=',ㄱ,ㄲ,ㄳ,ㄴ,ㄵ,ㄶ,ㄷ,ㄹ,ㄺ,ㄻ,ㄼ,ㄽ,ㄾ,ㄿ,ㅀ,ㅁ,ㅂ,ㅄ,ㅅ,ㅆ,ㅐ,ㅈ,ㅊ,ㅋ,ㅌ,ㅍ,ㅎ'.split(',')

print(len(first_letters), first_letters)
for each in first_letters: print(hex(ord(each)), end=' ')
print()
print(len(middle_letters), middle_letters)
for each in middle_letters: print(hex(ord(each)), end=' ')
print()
print(len(final_letters), final_letters)
# because [0] is ''. can't ord(it)
for each in final_letters[1:]: print(hex(ord(each)), end=' ')

이때 한글 조합의 순서는 다음과 같다. (반복문으로 이해)

for first_letters(ㄱ to ㅎ)

   for middle_letters(ㅏ to ㅣ)

      for final_letters( ' ' to ㅎ)

-> 가, 각, 갂, ...

 

uhangul 파일 import 해서 사용하기

초성,중성,종성 입력해서 해당하는 유니코드 조합해서 한글 만들기

#hcompose.py
#coding:utf-8

from uhangul import first_letters, middle_letters, final_letters

def compose(chosung, joongsung, jongsung):
   first_index = first_letters.index(chosung)
   middle_index = middle_letters. index(joongsung)
   final_index = final_letters.index(jongsung)
   return chr(0xAC00 + (first_index * 21 * 28) + (middle_index * 28) + final_index)
print(compose('ㄱ', 'ㅏ', 'ㄱ'))
print(compose('ㅎ', 'ㅣ', 'ㅎ'))
print(compose('ㅎ', 'ㅏ', ''))

하단에 print('I am ', __name__, __file__) 을 입력해주면 (name 은 파이썬에 이미 있는 변수로 main 이 담겨있음 마찬가지로 file 에는 실행시키는 파일 경로가 담겨있음)

-> I am __main__ /home/jek/cs4ks/hcompose.py 가 나오게 된다.

 

한글 입력해서 16진법(hex) 값으로 출력하기

#key_hangul.py
kbchar = input()
print(hex(ord(kbchar)))

 

한글 hex 를 이용해서 초성, 중성, 종성 index 알아내기

힣 : (18, 20, 27) : 0xD7A3

이전에 계산한 방법은 힣 = 0xAC00 + (18 * 21 * 28) + (20 * 28) + 27 이었다.

가 : (0, 0, 0) : 0xAC00 의 인덱스에서 힣의 인덱스까지 더해주어 찾은 것이다.

 

이제 거꾸로 찾기 위해서는 

우리가 찾고자 하는 문자의 hex 에 기준 hex 를 빼고 계산을 거꾸로 해주면 된다.

0xD7A3 - 0xAC00 = 11171

11171 % 28 = 27   // 종성

(11171 // 28) % 21 =20   // 중성

((11171 // 28) // 21) % 19 = 18   // 초성

한글 입력해서 초성,중성,종성 출력

#dcompose.py
#coding:utf-8
 from uhangul import first_letters, middle_letters, final_letters
 # 0xAC00 + (first_index * 21 * 28) + (middle_index * 21) + final_index
def decompose(hangul_sylla):
    code = ord(hangul_sylla) - 0xAC00
    final_index = code % 28
    code = code // 28
    middle_index = code % 21
    code = code // 21
    first_index = code
    return (first_letters[first_index], middle_letters[middle_index], final_letters[final_index])
print(decompose('힣'))
print(decompose('가'))
                                                                                                                             ~

% : 나머지

// : 몫 

 

*과제 제출

자신의 파일을 만들고 test.py

cp test.py /mount/cs4ks_2023/ug20191044_test.py : 과제 제출 폴더에 copy 해서 넣는다.

 

chmod o-rw /mount/cs4ks_2023/ug20191044_test.py : test.py 파일을 다른사람이 읽게 하지 않게 권한을 변경해준다.