콘텐츠로 건너뛰기
Home » 한글의 음소분리 문제

한글의 음소분리 문제

한글 문자열의 초/중/종성을 분리하는 예제를 포스팅한 적이 있는데, 이 때는 미처 알지 못했지만, 중요하게 놓친 문제가 있다. 그러니까 초/중/종성에 해당하는 자모와 각각의 낱자가 다른 글자라는 점이다.

예를 들어 ‘한'(U+D55C)자를 보자. 이 글자는 ‘ㅎ’, ‘ㅏ’, ‘ㄴ’ 의 세가지 자모로 분리된다. 이 때 ‘ㅎ’이 초성일 때와 종성일 때에는 같은 ‘ㅎ’으로 보이기는 해도, 같은 코드가 아니다. (그리고 지금 ‘ㅎ’으로 낱자로 쓰고 있는 이 글자 역시 같은 코드가 아니다.

‘ㅎ’을 표현하는 방식에는 다음 세 가지 방식이 있다.

  1. 낱자로서의 ‘ㅎ’ (U+314E)
  2. 초성 자모로서 ‘ㅎ’ (U+1112)
  3. 종성 자모로서 ‘ㅎ’ (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))
view raw jamo.py hosted with ❤ by GitHub
# 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
}
view raw jamodata.py hosted with ❤ by GitHub