목차
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 파일을 다른사람이 읽게 하지 않게 권한을 변경해준다.
'수업정리 > Fundamental' 카테고리의 다른 글
[Python] 한글 유니코드 2 - 한글을 byte 데이터로 만들기, byte(), bytearray() (0) | 2023.04.05 |
---|---|
Python basic 2 - 수학 함수(all, max, min, sorted, pow)format, zip (0) | 2023.03.31 |
command 명령어 1 (0) | 2023.03.22 |
python basic 1 - data type, 연산자, char(), ord(), int(), hex() (0) | 2023.03.15 |
vi 명령어 (0) | 2023.03.10 |