한글 문자열의 초/중/종성을 분리하는 예제를 포스팅한 적이 있는데, 이 때는 미처 알지 못했지만, 중요하게 놓친 문제가 있다. 그러니까 초/중/종성에 해당하는 자모와 각각의 낱자가 다른 글자라는 점이다.
예를 들어 ‘한'(U+D55C)자를 보자. 이 글자는 ‘ㅎ’, ‘ㅏ’, ‘ㄴ’ 의 세가지 자모로 분리된다. 이 때 ‘ㅎ’이 초성일 때와 종성일 때에는 같은 ‘ㅎ’으로 보이기는 해도, 같은 코드가 아니다. (그리고 지금 ‘ㅎ’으로 낱자로 쓰고 있는 이 글자 역시 같은 코드가 아니다.
‘ㅎ’을 표현하는 방식에는 다음 세 가지 방식이 있다.
- 낱자로서의 ‘ㅎ’ (U+314E)
- 초성 자모로서 ‘ㅎ’ (U+1112)
- 종성 자모로서 ‘ㅎ’ (U+11C2)
이는 유니코드에서는 완성형과 조합형 한글을 모두 지원하기 때문이다. ‘가’에서부터 ‘힣’에 이르는 자모로 조합가능한 모든 한글글자는 Hangul Syllables 블럭에 정의되어 있다. 그리고 이러한 Syllables를 조합하는데 사용되는 자모들은 모두 Hangul Jamo에 정의된다. 낱자로서의 자모는 Hangul Compatibility Jamo 에 정의되어 있다. 기존의 초성 구하기 코드에서 구하는 답은 자모 코드에 해당한다.
이 자모 코드는 기본적으로 서로 결합하여 완성된 글자(Hangul Syllables)를 구성하는데 쓰인다. 따라서 자모 문자의 코드값으로부터 문자를 얻어서 출력했을 때에는 각 자모 낱자의 출력결과와 구분할 수 없기는 하나 정확한 답이 아닌 것이다.
실질적으로 이 문제는 유니코드를 잘 지원하는 언어일수록 치명적이다. 예를 들어서 “안녕하세요”의 초성 자모만 구하면 “ㅇㄴㅎㅅㅇ”를 기대하게 된다. 그런데 Swift의 경우 같은 로직으로 초성 자모를 구해서 문자(Character)로 변환 후 이들을 모아서 출력하면 “ㅇㄶㅅㅇ”가 출력된다. 자모 ‘ㄴ’과 ‘ㅎ’은 더해지면 ‘ㄶ’이 되는 것이다. 이를 정확하게 출력하려면 Hangul Jamo 의 문자를 Hangul Compatibility Jamo 블럭의 문자로 변환해야 한다.
유감스럽게도 이 두 블럭의 문자 코드는 간단한 수식으로 변환할 수 없다. 한글 자모는 ㄱ, ㄲ, ㄴ, ㄷ, ㄸ … 이런 순서이고 조합형 자모의 경우에는 ㄱ, ㄲ, ㄳ, ㄴ, ㄵ, ㄶ, ㄷ, … 이렇게 되기 때문에 순서가 거의 뒤죽박죽으로 보일 지경이다.
이를 해결하는 방법은 각 자모 낱자의 이름을 활용해서 변환 맵을 만드는 것이다. 유니코드 코드 테이블을 제공하는 페이지들을 검색해보면 각 자모의 이름이 붙어 있다. 예를 들어 Hangul Jamo 블럭의 문자 목록에는 U+1100, ㄱ, Hangul Choseong Kiyeok 이라는 식으로 데이터가 들어있다. 이제 Hangul Jamo 와 Hangul Compatibility Jamo 테이블의 자료를 좍 긁어와서 편집기에서 이런저런 변환을 좀 거쳐서 1100, Kiyeok 을 추출하여 맵을 만든다. 예를 들어 낱자모 ‘ㄱ’ 은 “Hangul Choseong Kiyeok”, “Hangul Jongseong Kiyeok”, “Hangul Letter Kiyeok” 등 다양한 코드가 있는데 이 때 모두 이름에 ‘Kiyeok’이 들어가 있다. 이를 사용해서 자모 ‘ㄱ’에 대해서 그 코드값으로부터 영문이름, 다시 낱자의 코드값을 다음과 같이 0x1100 > ‘Kiyeok’ > 0x3131 찾을 수 있다.
다음 코드는 자모 및 낱자의 이름과 코드를 변환하기 위한 맵을 사전으로 만든 데이터와 이를 활용해서 한글문자열에서 초성을 분리한 다음 낱자로 변환하여 반환하는 함수를 구현한 파이썬 예제이다.
import jamodata | |
# 초성 | |
def choseong(c): | |
'''초성의 자모 코드값을 리턴''' | |
v = ord(c) | |
if 0xAC00 <= v <= 0xD7A3: | |
key = (v – 0xac00) // 28 // 21 + 0x1100 | |
name = jamodata.jamo_indices[key] | |
return chr(jamodata.letters[name]) | |
return v | |
def joongseong(c): | |
'''중성의 자모를 낱자로 리턴''' | |
v = ord(c) | |
if 0xAC00 <= v <= 0xD7A3: | |
key = ((v – 0xac00) // 28) % 21 + 0x1161 | |
name = jamodata.jamo_indices[key] | |
return chr(jamodata.letters[name]) | |
return v | |
def jongseong(c): | |
'''종성의 자모를 낱자로 리턴''' | |
v = ord(c) | |
if 0xAC00 <= v <= 0xD7A3: | |
key = (v – 0xac00) % 28 + 0x11a7 | |
if key == 0x11a7: | |
return ' ' | |
name = jamodata.jamo_indices[key] | |
return chr(jamodata.letters[name]) | |
return v | |
if __name__ == '__main__': | |
s = "안녕하셁요" | |
print(''.join(choseong(x) for x in s)) | |
print(''.join(joongseong(x) for x in s)) | |
print(''.join(jongseong(x) for x in s)) |
# letters_indices : code -> 글자이름 | |
# letters : 글자이름 -> 코드 | |
# jamo_indices : code -> 자모이름 | |
# jamo : 자모이름 -> 코드 | |
letters_indices = { | |
0x3131: "Kiyeok", | |
0x3132: "Ssangkiyeok", | |
0x3133: "Kiyeok-Sios", | |
0x3134: "Nieun", | |
0x3135: "Nieun-Cieuc", | |
0x3136: "Nieun-Hieuh", | |
0x3137: "Tikeut", | |
0x3138: "Ssangtikeut", | |
0x3139: "Rieul", | |
0x313A: "Rieul-Kiyeok", | |
0x313B: "Rieul-Mieum", | |
0x313C: "Rieul-Pieup", | |
0x313D: "Rieul-Sios", | |
0x313E: "Rieul-Thieuth", | |
0x313F: "Rieul-Phieuph", | |
0x3140: "Rieul-Hieuh", | |
0x3141: "Mieum", | |
0x3142: "Pieup", | |
0x3143: "Ssangpieup", | |
0x3144: "Pieup-Sios", | |
0x3145: "Sios", | |
0x3146: "Ssangsios", | |
0x3147: "Ieung", | |
0x3148: "Cieuc", | |
0x3149: "Ssangcieuc", | |
0x314A: "Chieuch", | |
0x314B: "Khieukh", | |
0x314C: "Thieuth", | |
0x314D: "Phieuph", | |
0x314E: "Hieuh", | |
0x314F: "A", | |
0x3150: "Ae", | |
0x3151: "Ya", | |
0x3152: "Yae", | |
0x3153: "Eo", | |
0x3154: "E", | |
0x3155: "Yeo", | |
0x3156: "Ye", | |
0x3157: "O", | |
0x3158: "Wa", | |
0x3159: "Wae", | |
0x315A: "Oe", | |
0x315B: "Yo", | |
0x315C: "U", | |
0x315D: "Weo", | |
0x315E: "We", | |
0x315F: "Wi", | |
0x3160: "Yu", | |
0x3161: "Eu", | |
0x3162: "Yi", | |
0x3163: "I", | |
0x3164: "Filler", | |
0x3165: "Ssangnieun", | |
0x3166: "Nieun-Tikeut", | |
0x3167: "Nieun-Sios", | |
0x3168: "Nieun-Pansios", | |
0x3169: "Rieul-Kiyeok-Sios", | |
0x316A: "Rieul-Tikeut", | |
0x316B: "Rieul-Pieup-Sios", | |
0x316C: "Rieul-Pansios", | |
0x316D: "Rieul-Yeorinhieuh", | |
0x316E: "Mieum-Pieup", | |
0x316F: "Mieum-Sios", | |
0x3170: "Mieum-Pansios", | |
0x3171: "Kapyeounmieum", | |
0x3172: "Pieup-Kiyeok", | |
0x3173: "Pieup-Tikeut", | |
0x3174: "Pieup-Sios-Kiyeok", | |
0x3175: "Pieup-Sios-Tikeut", | |
0x3176: "Pieup-Cieuc", | |
0x3177: "Pieup-Thieuth", | |
0x3178: "Kapyeounpieup", | |
0x3179: "Kapyeounssangpieup", | |
0x317A: "Sios-Kiyeok", | |
0x317B: "Sios-Nieun", | |
0x317C: "Sios-Tikeut", | |
0x317D: "Sios-Pieup", | |
0x317E: "Sios-Cieuc", | |
0x317F: "Pansios", | |
0x3180: "Ssangieung", | |
0x3181: "Yesieung", | |
0x3182: "Yesieung-Sios", | |
0x3183: "Yesieung-Pansios", | |
0x3184: "Kapyeounphieuph", | |
0x3185: "Ssanghieuh", | |
0x3186: "Yeorinhieuh", | |
0x3187: "Yo-Ya", | |
0x3188: "Yo-Yae", | |
0x3189: "Yo-I", | |
0x318A: "Yu-Yeo", | |
0x318B: "Yu-Ye", | |
0x318C: "Yu-I", | |
0x318D: "Araea", | |
0x318E: "Araeae", | |
} | |
jamo_indices = { | |
0x1100: "Kiyeok", | |
0x1101: "Ssangkiyeok", | |
0x1102: "Nieun", | |
0x1103: "Tikeut", | |
0x1104: "Ssangtikeut", | |
0x1105: "Rieul", | |
0x1106: "Mieum", | |
0x1107: "Pieup", | |
0x1108: "Ssangpieup", | |
0x1109: "Sios", | |
0x110A: "Ssangsios", | |
0x110B: "Ieung", | |
0x110C: "Cieuc", | |
0x110D: "Ssangcieuc", | |
0x110E: "Chieuch", | |
0x110F: "Khieukh", | |
0x1110: "Thieuth", | |
0x1111: "Phieuph", | |
0x1112: "Hieuh", | |
0x1113: "Nieun-Kiyeok", | |
0x1114: "Ssangnieun", | |
0x1115: "Nieun-Tikeut", | |
0x1116: "Nieun-Pieup", | |
0x1117: "Tikeut-Kiyeok", | |
0x1118: "Rieul-Nieun", | |
0x1119: "Ssangrieul", | |
0x111A: "Rieul-Hieuh", | |
0x111B: "Kapyeounrieul", | |
0x111C: "Mieum-Pieup", | |
0x111D: "Kapyeounmieum", | |
0x111E: "Pieup-Kiyeok", | |
0x111F: "Pieup-Nieun", | |
0x1120: "Pieup-Tikeut", | |
0x1121: "Pieup-Sios", | |
0x1122: "Pieup-Sios-Kiyeok", | |
0x1123: "Pieup-Sios-Tikeut", | |
0x1124: "Pieup-Sios-Pieup", | |
0x1125: "Pieup-Ssangsios", | |
0x1126: "Pieup-Sios-Cieuc", | |
0x1127: "Pieup-Cieuc", | |
0x1128: "Pieup-Chieuch", | |
0x1129: "Pieup-Thieuth", | |
0x112A: "Pieup-Phieuph", | |
0x112B: "Kapyeounpieup", | |
0x112C: "Kapyeounssangpieup", | |
0x112D: "Sios-Kiyeok", | |
0x112E: "Sios-Nieun", | |
0x112F: "Sios-Tikeut", | |
0x1130: "Sios-Rieul", | |
0x1131: "Sios-Mieum", | |
0x1132: "Sios-Pieup", | |
0x1133: "Sios-Pieup-Kiyeok", | |
0x1134: "Sios-Ssangsios", | |
0x1135: "Sios-Ieung", | |
0x1136: "Sios-Cieuc", | |
0x1137: "Sios-Chieuch", | |
0x1138: "Sios-Khieukh", | |
0x1139: "Sios-Thieuth", | |
0x113A: "Sios-Phieuph", | |
0x113B: "Sios-Hieuh", | |
0x113C: "Chitueumsios", | |
0x113D: "Chitueumssangsios", | |
0x113E: "Ceongchieumsios", | |
0x113F: "Ceongchieumssangsios", | |
0x1140: "Pansios", | |
0x1141: "Ieung-Kiyeok", | |
0x1142: "Ieung-Tikeut", | |
0x1143: "Ieung-Mieum", | |
0x1144: "Ieung-Pieup", | |
0x1145: "Ieung-Sios", | |
0x1146: "Ieung-Pansios", | |
0x1147: "Ssangieung", | |
0x1148: "Ieung-Cieuc", | |
0x1149: "Ieung-Chieuch", | |
0x114A: "Ieung-Thieuth", | |
0x114B: "Ieung-Phieuph", | |
0x114C: "Yesieung", | |
0x114D: "Cieuc-Ieung", | |
0x114E: "Chitueumcieuc", | |
0x114F: "Chitueumssangcieuc", | |
0x1150: "Ceongchieumcieuc", | |
0x1151: "Ceongchieumssangcieuc", | |
0x1152: "Chieuch-Khieukh", | |
0x1153: "Chieuch-Hieuh", | |
0x1154: "Chitueumchieuch", | |
0x1155: "Ceongchieumchieuch", | |
0x1156: "Phieuph-Pieup", | |
0x1157: "Kapyeounphieuph", | |
0x1158: "Ssanghieuh", | |
0x1159: "Yeorinhieuh", | |
0x115A: "Kiyeok-Tikeut", | |
0x115B: "Nieun-Sios", | |
0x115C: "Nieun-Cieuc", | |
0x115D: "Nieun-Hieuh", | |
0x115E: "Tikeut-Rieul", | |
0x115F: "Filler", | |
0x1160: "Filler", | |
0x1161: "A", | |
0x1162: "Ae", | |
0x1163: "Ya", | |
0x1164: "Yae", | |
0x1165: "Eo", | |
0x1166: "E", | |
0x1167: "Yeo", | |
0x1168: "Ye", | |
0x1169: "O", | |
0x116A: "Wa", | |
0x116B: "Wae", | |
0x116C: "Oe", | |
0x116D: "Yo", | |
0x116E: "U", | |
0x116F: "Weo", | |
0x1170: "We", | |
0x1171: "Wi", | |
0x1172: "Yu", | |
0x1173: "Eu", | |
0x1174: "Yi", | |
0x1175: "I", | |
0x1176: "A-O", | |
0x1177: "A-U", | |
0x1178: "Ya-O", | |
0x1179: "Ya-Yo", | |
0x117A: "Eo-O", | |
0x117B: "Eo-U", | |
0x117C: "Eo-Eu", | |
0x117D: "Yeo-O", | |
0x117E: "Yeo-U", | |
0x117F: "O-Eo", | |
0x1180: "O-E", | |
0x1181: "O-Ye", | |
0x1182: "O-O", | |
0x1183: "O-U", | |
0x1184: "Yo-Ya", | |
0x1185: "Yo-Yae", | |
0x1186: "Yo-Yeo", | |
0x1187: "Yo-O", | |
0x1188: "Yo-I", | |
0x1189: "U-A", | |
0x118A: "U-Ae", | |
0x118B: "U-Eo-Eu", | |
0x118C: "U-Ye", | |
0x118D: "U-U", | |
0x118E: "Yu-A", | |
0x118F: "Yu-Eo", | |
0x1190: "Yu-E", | |
0x1191: "Yu-Yeo", | |
0x1192: "Yu-Ye", | |
0x1193: "Yu-U", | |
0x1194: "Yu-I", | |
0x1195: "Eu-U", | |
0x1196: "Eu-Eu", | |
0x1197: "Yi-U", | |
0x1198: "I-A", | |
0x1199: "I-Ya", | |
0x119A: "I-O", | |
0x119B: "I-U", | |
0x119C: "I-Eu", | |
0x119D: "I-Araea", | |
0x119E: "Araea", | |
0x119F: "Araea-Eo", | |
0x11A0: "Araea-U", | |
0x11A1: "Araea-I", | |
0x11A2: "Ssangaraea", | |
0x11A3: "A-Eu", | |
0x11A4: "Ya-U", | |
0x11A5: "Yeo-Ya", | |
0x11A6: "O-Ya", | |
0x11A7: "O-Yae", | |
0x11A8: "Kiyeok", | |
0x11A9: "Ssangkiyeok", | |
0x11AA: "Kiyeok-Sios", | |
0x11AB: "Nieun", | |
0x11AC: "Nieun-Cieuc", | |
0x11AD: "Nieun-Hieuh", | |
0x11AE: "Tikeut", | |
0x11AF: "Rieul", | |
0x11B0: "Rieul-Kiyeok", | |
0x11B1: "Rieul-Mieum", | |
0x11B2: "Rieul-Pieup", | |
0x11B3: "Rieul-Sios", | |
0x11B4: "Rieul-Thieuth", | |
0x11B5: "Rieul-Phieuph", | |
0x11B6: "Rieul-Hieuh", | |
0x11B7: "Mieum", | |
0x11B8: "Pieup", | |
0x11B9: "Pieup-Sios", | |
0x11BA: "Sios", | |
0x11BB: "Ssangsios", | |
0x11BC: "Ieung", | |
0x11BD: "Cieuc", | |
0x11BE: "Chieuch", | |
0x11BF: "Khieukh", | |
0x11C0: "Thieuth", | |
0x11C1: "Phieuph", | |
0x11C2: "Hieuh", | |
0x11C3: "Kiyeok-Rieul", | |
0x11C4: "Kiyeok-Sios-Kiyeok", | |
0x11C5: "Nieun-Kiyeok", | |
0x11C6: "Nieun-Tikeut", | |
0x11C7: "Nieun-Sios", | |
0x11C8: "Nieun-Pansios", | |
0x11C9: "Nieun-Thieuth", | |
0x11CA: "Tikeut-Kiyeok", | |
0x11CB: "Tikeut-Rieul", | |
0x11CC: "Rieul-Kiyeok-Sios", | |
0x11CD: "Rieul-Nieun", | |
0x11CE: "Rieul-Tikeut", | |
0x11CF: "Rieul-Tikeut-Hieuh", | |
0x11D0: "Ssangrieul", | |
0x11D1: "Rieul-Mieum-Kiyeok", | |
0x11D2: "Rieul-Mieum-Sios", | |
0x11D3: "Rieul-Pieup-Sios", | |
0x11D4: "Rieul-Pieup-Hieuh", | |
0x11D5: "Rieul-Kapyeounpieup", | |
0x11D6: "Rieul-Ssangsios", | |
0x11D7: "Rieul-Pansios", | |
0x11D8: "Rieul-Khieukh", | |
0x11D9: "Rieul-Yeorinhieuh", | |
0x11DA: "Mieum-Kiyeok", | |
0x11DB: "Mieum-Rieul", | |
0x11DC: "Mieum-Pieup", | |
0x11DD: "Mieum-Sios", | |
0x11DE: "Mieum-Ssangsios", | |
0x11DF: "Mieum-Pansios", | |
0x11E0: "Mieum-Chieuch", | |
0x11E1: "Mieum-Hieuh", | |
0x11E2: "Kapyeounmieum", | |
0x11E3: "Pieup-Rieul", | |
0x11E4: "Pieup-Phieuph", | |
0x11E5: "Pieup-Hieuh", | |
0x11E6: "Kapyeounpieup", | |
0x11E7: "Sios-Kiyeok", | |
0x11E8: "Sios-Tikeut", | |
0x11E9: "Sios-Rieul", | |
0x11EA: "Sios-Pieup", | |
0x11EB: "Pansios", | |
0x11EC: "Ieung-Kiyeok", | |
0x11ED: "Ieung-Ssangkiyeok", | |
0x11EE: "Ssangieung", | |
0x11EF: "Ieung-Khieukh", | |
0x11F0: "Yesieung", | |
0x11F1: "Yesieung-Sios", | |
0x11F2: "Yesieung-Pansios", | |
0x11F3: "Phieuph-Pieup", | |
0x11F4: "Kapyeounphieuph", | |
0x11F5: "Hieuh-Nieun", | |
0x11F6: "Hieuh-Rieul", | |
0x11F7: "Hieuh-Mieum", | |
0x11F8: "Hieuh-Pieup", | |
0x11F9: "Yeorinhieuh", | |
0x11FA: "Kiyeok-Nieun", | |
0x11FB: "Kiyeok-Pieup", | |
0x11FC: "Kiyeok-Chieuch", | |
0x11FD: "Kiyeok-Khieukh", | |
0x11FE: "Kiyeok-Hieuh", | |
0x11FF: "Ssangnieun", | |
} | |
letters = { | |
"Kiyeok": 0x3131, | |
"Ssangkiyeok": 0x3132, | |
"Kiyeok-Sios": 0x3133, | |
"Nieun": 0x3134, | |
"Nieun-Cieuc": 0x3135, | |
"Nieun-Hieuh": 0x3136, | |
"Tikeut": 0x3137, | |
"Ssangtikeut": 0x3138, | |
"Rieul": 0x3139, | |
"Rieul-Kiyeok": 0x313A, | |
"Rieul-Mieum": 0x313B, | |
"Rieul-Pieup": 0x313C, | |
"Rieul-Sios": 0x313D, | |
"Rieul-Thieuth": 0x313E, | |
"Rieul-Phieuph": 0x313F, | |
"Rieul-Hieuh": 0x3140, | |
"Mieum": 0x3141, | |
"Pieup": 0x3142, | |
"Ssangpieup": 0x3143, | |
"Pieup-Sios": 0x3144, | |
"Sios": 0x3145, | |
"Ssangsios": 0x3146, | |
"Ieung": 0x3147, | |
"Cieuc": 0x3148, | |
"Ssangcieuc": 0x3149, | |
"Chieuch": 0x314A, | |
"Khieukh": 0x314B, | |
"Thieuth": 0x314C, | |
"Phieuph": 0x314D, | |
"Hieuh": 0x314E, | |
"A": 0x314F, | |
"Ae": 0x3150, | |
"Ya": 0x3151, | |
"Yae": 0x3152, | |
"Eo": 0x3153, | |
"E": 0x3154, | |
"Yeo": 0x3155, | |
"Ye": 0x3156, | |
"O": 0x3157, | |
"Wa": 0x3158, | |
"Wae": 0x3159, | |
"Oe": 0x315A, | |
"Yo": 0x315B, | |
"U": 0x315C, | |
"Weo": 0x315D, | |
"We": 0x315E, | |
"Wi": 0x315F, | |
"Yu": 0x3160, | |
"Eu": 0x3161, | |
"Yi": 0x3162, | |
"I": 0x3163, | |
"Ssangnieun": 0x3165, | |
"Nieun-Tikeut": 0x3166, | |
"Nieun-Sios": 0x3167, | |
"Nieun-Pansios": 0x3168, | |
"Rieul-Kiyeok-Sios": 0x3169, | |
"Rieul-Tikeut": 0x316A, | |
"Rieul-Pieup-Sios": 0x316B, | |
"Rieul-Pansios": 0x316C, | |
"Rieul-Yeorinhieuh": 0x316D, | |
"Mieum-Pieup": 0x316E, | |
"Mieum-Sios": 0x316F, | |
"Mieum-Pansios": 0x3170, | |
"Kapyeounmieum": 0x3171, | |
"Pieup-Kiyeok": 0x3172, | |
"Pieup-Tikeut": 0x3173, | |
"Pieup-Sios-Kiyeok": 0x3174, | |
"Pieup-Sios-Tikeut": 0x3175, | |
"Pieup-Cieuc": 0x3176, | |
"Pieup-Thieuth": 0x3177, | |
"Kapyeounpieup": 0x3178, | |
"Kapyeounssangpieup": 0x3179, | |
"Sios-Kiyeok": 0x317A, | |
"Sios-Nieun": 0x317B, | |
"Sios-Tikeut": 0x317C, | |
"Sios-Pieup": 0x317D, | |
"Sios-Cieuc": 0x317E, | |
"Pansios": 0x317F, | |
"Ssangieung": 0x3180, | |
"Yesieung": 0x3181, | |
"Yesieung-Sios": 0x3182, | |
"Yesieung-Pansios": 0x3183, | |
"Kapyeounphieuph": 0x3184, | |
"Ssanghieuh": 0x3185, | |
"Yeorinhieuh": 0x3186, | |
"Yo-Ya": 0x3187, | |
"Yo-Yae": 0x3188, | |
"Yo-I": 0x3189, | |
"Yu-Yeo": 0x318A, | |
"Yu-Ye": 0x318B, | |
"Yu-I": 0x318C, | |
"Araea": 0x318D, | |
"Araeae": 0x318E, | |
} | |
jamo = { | |
"Kiyeok": 0x1100, | |
"Ssangkiyeok": 0x1101, | |
"Nieun": 0x1102, | |
"Tikeut": 0x1103, | |
"Ssangtikeut": 0x1104, | |
"Rieul": 0x1105, | |
"Mieum": 0x1106, | |
"Pieup": 0x1107, | |
"Ssangpieup": 0x1108, | |
"Sios": 0x1109, | |
"Ssangsios": 0x110A, | |
"Ieung": 0x110B, | |
"Cieuc": 0x110C, | |
"Ssangcieuc": 0x110D, | |
"Chieuch": 0x110E, | |
"Khieukh": 0x110F, | |
"Thieuth": 0x1110, | |
"Phieuph": 0x1111, | |
"Hieuh": 0x1112, | |
"Nieun-Kiyeok": 0x1113, | |
"Ssangnieun": 0x1114, | |
"Nieun-Tikeut": 0x1115, | |
"Nieun-Pieup": 0x1116, | |
"Tikeut-Kiyeok": 0x1117, | |
"Rieul-Nieun": 0x1118, | |
"Ssangrieul": 0x1119, | |
"Rieul-Hieuh": 0x111A, | |
"Kapyeounrieul": 0x111B, | |
"Mieum-Pieup": 0x111C, | |
"Kapyeounmieum": 0x111D, | |
"Pieup-Kiyeok": 0x111E, | |
"Pieup-Nieun": 0x111F, | |
"Pieup-Tikeut": 0x1120, | |
"Pieup-Sios": 0x1121, | |
"Pieup-Sios-Kiyeok": 0x1122, | |
"Pieup-Sios-Tikeut": 0x1123, | |
"Pieup-Sios-Pieup": 0x1124, | |
"Pieup-Ssangsios": 0x1125, | |
"Pieup-Sios-Cieuc": 0x1126, | |
"Pieup-Cieuc": 0x1127, | |
"Pieup-Chieuch": 0x1128, | |
"Pieup-Thieuth": 0x1129, | |
"Pieup-Phieuph": 0x112A, | |
"Kapyeounpieup": 0x112B, | |
"Kapyeounssangpieup": 0x112C, | |
"Sios-Kiyeok": 0x112D, | |
"Sios-Nieun": 0x112E, | |
"Sios-Tikeut": 0x112F, | |
"Sios-Rieul": 0x1130, | |
"Sios-Mieum": 0x1131, | |
"Sios-Pieup": 0x1132, | |
"Sios-Pieup-Kiyeok": 0x1133, | |
"Sios-Ssangsios": 0x1134, | |
"Sios-Ieung": 0x1135, | |
"Sios-Cieuc": 0x1136, | |
"Sios-Chieuch": 0x1137, | |
"Sios-Khieukh": 0x1138, | |
"Sios-Thieuth": 0x1139, | |
"Sios-Phieuph": 0x113A, | |
"Sios-Hieuh": 0x113B, | |
"Chitueumsios": 0x113C, | |
"Chitueumssangsios": 0x113D, | |
"Ceongchieumsios": 0x113E, | |
"Ceongchieumssangsios": 0x113F, | |
"Pansios": 0x1140, | |
"Ieung-Kiyeok": 0x1141, | |
"Ieung-Tikeut": 0x1142, | |
"Ieung-Mieum": 0x1143, | |
"Ieung-Pieup": 0x1144, | |
"Ieung-Sios": 0x1145, | |
"Ieung-Pansios": 0x1146, | |
"Ssangieung": 0x1147, | |
"Ieung-Cieuc": 0x1148, | |
"Ieung-Chieuch": 0x1149, | |
"Ieung-Thieuth": 0x114A, | |
"Ieung-Phieuph": 0x114B, | |
"Yesieung": 0x114C, | |
"Cieuc-Ieung": 0x114D, | |
"Chitueumcieuc": 0x114E, | |
"Chitueumssangcieuc": 0x114F, | |
"Ceongchieumcieuc": 0x1150, | |
"Ceongchieumssangcieuc": 0x1151, | |
"Chieuch-Khieukh": 0x1152, | |
"Chieuch-Hieuh": 0x1153, | |
"Chitueumchieuch": 0x1154, | |
"Ceongchieumchieuch": 0x1155, | |
"Phieuph-Pieup": 0x1156, | |
"Kapyeounphieuph": 0x1157, | |
"Ssanghieuh": 0x1158, | |
"Yeorinhieuh": 0x1159, | |
"Kiyeok-Tikeut": 0x115A, | |
"Nieun-Sios": 0x115B, | |
"Nieun-Cieuc": 0x115C, | |
"Nieun-Hieuh": 0x115D, | |
"Tikeut-Rieul": 0x115E, | |
"Filler": 0x115F, | |
"Filler": 0x1160, | |
"A": 0x1161, | |
"Ae": 0x1162, | |
"Ya": 0x1163, | |
"Yae": 0x1164, | |
"Eo": 0x1165, | |
"E": 0x1166, | |
"Yeo": 0x1167, | |
"Ye": 0x1168, | |
"O": 0x1169, | |
"Wa": 0x116A, | |
"Wae": 0x116B, | |
"Oe": 0x116C, | |
"Yo": 0x116D, | |
"U": 0x116E, | |
"Weo": 0x116F, | |
"We": 0x1170, | |
"Wi": 0x1171, | |
"Yu": 0x1172, | |
"Eu": 0x1173, | |
"Yi": 0x1174, | |
"I": 0x1175, | |
"A-O": 0x1176, | |
"A-U": 0x1177, | |
"Ya-O": 0x1178, | |
"Ya-Yo": 0x1179, | |
"Eo-O": 0x117A, | |
"Eo-U": 0x117B, | |
"Eo-Eu": 0x117C, | |
"Yeo-O": 0x117D, | |
"Yeo-U": 0x117E, | |
"O-Eo": 0x117F, | |
"O-E": 0x1180, | |
"O-Ye": 0x1181, | |
"O-O": 0x1182, | |
"O-U": 0x1183, | |
"Yo-Ya": 0x1184, | |
"Yo-Yae": 0x1185, | |
"Yo-Yeo": 0x1186, | |
"Yo-O": 0x1187, | |
"Yo-I": 0x1188, | |
"U-A": 0x1189, | |
"U-Ae": 0x118A, | |
"U-Eo-Eu": 0x118B, | |
"U-Ye": 0x118C, | |
"U-U": 0x118D, | |
"Yu-A": 0x118E, | |
"Yu-Eo": 0x118F, | |
"Yu-E": 0x1190, | |
"Yu-Yeo": 0x1191, | |
"Yu-Ye": 0x1192, | |
"Yu-U": 0x1193, | |
"Yu-I": 0x1194, | |
"Eu-U": 0x1195, | |
"Eu-Eu": 0x1196, | |
"Yi-U": 0x1197, | |
"I-A": 0x1198, | |
"I-Ya": 0x1199, | |
"I-O": 0x119A, | |
"I-U": 0x119B, | |
"I-Eu": 0x119C, | |
"I-Araea": 0x119D, | |
"Araea": 0x119E, | |
"Araea-Eo": 0x119F, | |
"Araea-U": 0x11A0, | |
"Araea-I": 0x11A1, | |
"Ssangaraea": 0x11A2, | |
"A-Eu": 0x11A3, | |
"Ya-U": 0x11A4, | |
"Yeo-Ya": 0x11A5, | |
"O-Ya": 0x11A6, | |
"O-Yae": 0x11A7, | |
"Kiyeok": 0x11A8, | |
"Ssangkiyeok": 0x11A9, | |
"Kiyeok-Sios": 0x11AA, | |
"Nieun": 0x11AB, | |
"Nieun-Cieuc": 0x11AC, | |
"Nieun-Hieuh": 0x11AD, | |
"Tikeut": 0x11AE, | |
"Rieul": 0x11AF, | |
"Rieul-Kiyeok": 0x11B0, | |
"Rieul-Mieum": 0x11B1, | |
"Rieul-Pieup": 0x11B2, | |
"Rieul-Sios": 0x11B3, | |
"Rieul-Thieuth": 0x11B4, | |
"Rieul-Phieuph": 0x11B5, | |
"Rieul-Hieuh": 0x11B6, | |
"Mieum": 0x11B7, | |
"Pieup": 0x11B8, | |
"Pieup-Sios": 0x11B9, | |
"Sios": 0x11BA, | |
"Ssangsios": 0x11BB, | |
"Ieung": 0x11BC, | |
"Cieuc": 0x11BD, | |
"Chieuch": 0x11BE, | |
"Khieukh": 0x11BF, | |
"Thieuth": 0x11C0, | |
"Phieuph": 0x11C1, | |
"Hieuh": 0x11C2, | |
"Kiyeok-Rieul": 0x11C3, | |
"Kiyeok-Sios-Kiyeok": 0x11C4, | |
"Nieun-Kiyeok": 0x11C5, | |
"Nieun-Tikeut": 0x11C6, | |
"Nieun-Sios": 0x11C7, | |
"Nieun-Pansios": 0x11C8, | |
"Nieun-Thieuth": 0x11C9, | |
"Tikeut-Kiyeok": 0x11CA, | |
"Tikeut-Rieul": 0x11CB, | |
"Rieul-Kiyeok-Sios": 0x11CC, | |
"Rieul-Nieun": 0x11CD, | |
"Rieul-Tikeut": 0x11CE, | |
"Rieul-Tikeut-Hieuh": 0x11CF, | |
"Ssangrieul": 0x11D0, | |
"Rieul-Mieum-Kiyeok": 0x11D1, | |
"Rieul-Mieum-Sios": 0x11D2, | |
"Rieul-Pieup-Sios": 0x11D3, | |
"Rieul-Pieup-Hieuh": 0x11D4, | |
"Rieul-Kapyeounpieup": 0x11D5, | |
"Rieul-Ssangsios": 0x11D6, | |
"Rieul-Pansios": 0x11D7, | |
"Rieul-Khieukh": 0x11D8, | |
"Rieul-Yeorinhieuh": 0x11D9, | |
"Mieum-Kiyeok": 0x11DA, | |
"Mieum-Rieul": 0x11DB, | |
"Mieum-Pieup": 0x11DC, | |
"Mieum-Sios": 0x11DD, | |
"Mieum-Ssangsios": 0x11DE, | |
"Mieum-Pansios": 0x11DF, | |
"Mieum-Chieuch": 0x11E0, | |
"Mieum-Hieuh": 0x11E1, | |
"Kapyeounmieum": 0x11E2, | |
"Pieup-Rieul": 0x11E3, | |
"Pieup-Phieuph": 0x11E4, | |
"Pieup-Hieuh": 0x11E5, | |
"Kapyeounpieup": 0x11E6, | |
"Sios-Kiyeok": 0x11E7, | |
"Sios-Tikeut": 0x11E8, | |
"Sios-Rieul": 0x11E9, | |
"Sios-Pieup": 0x11EA, | |
"Pansios": 0x11EB, | |
"Ieung-Kiyeok": 0x11EC, | |
"Ieung-Ssangkiyeok": 0x11ED, | |
"Ssangieung": 0x11EE, | |
"Ieung-Khieukh": 0x11EF, | |
"Yesieung": 0x11F0, | |
"Yesieung-Sios": 0x11F1, | |
"Yesieung-Pansios": 0x11F2, | |
"Phieuph-Pieup": 0x11F3, | |
"Kapyeounphieuph": 0x11F4, | |
"Hieuh-Nieun": 0x11F5, | |
"Hieuh-Rieul": 0x11F6, | |
"Hieuh-Mieum": 0x11F7, | |
"Hieuh-Pieup": 0x11F8, | |
"Yeorinhieuh": 0x11F9, | |
"Kiyeok-Nieun": 0x11FA, | |
"Kiyeok-Pieup": 0x11FB, | |
"Kiyeok-Chieuch": 0x11FC, | |
"Kiyeok-Khieukh": 0x11FD, | |
"Kiyeok-Hieuh": 0x11FE, | |
"Ssangnieun": 0x11FF | |
} | |