18 | | Const EngDat = "rRseEfaqQtTdwWczxvgkoiOjpuPhynbml" |
19 | | Const HanDat = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ" |
20 | | Const ChoDat = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ" |
21 | | Const JungDat = "ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ" |
22 | | Const JongDat = "ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ" |
23 | | |
24 | | Private Sub optEtoH_OnClick() |
25 | | txtSource_OnKeyUp |
26 | | End Sub |
27 | | |
28 | | Private Sub optHtoE_OnClick() |
29 | | txtSource_OnKeyUp |
30 | | End Sub |
31 | | |
32 | | Private Sub txtSource_OnKeyUp() |
33 | | If optEtoH.Checked Then |
34 | | txtConv.Value = EngTypeToHan(txtSource.Value) |
35 | | Else |
36 | | txtConv.Value = HanTypeToEng(txtSource.Value) |
37 | | End If |
38 | | End Sub |
39 | | |
40 | | Function EngTypeToHan(Source) |
41 | | Dim ConvText, tChr |
42 | | Dim Cho, Jung, Jong, tVal '초성, 중성, 종성, (임시용) 초성 |
43 | | Dim i, p |
44 | | |
45 | | If Len(Source) = 0 Then Exit Function |
46 | | For i = 1 To Len(Source) |
47 | | tChr = Mid(Source, i, 1) |
48 | | p = InStr(EngDat, tChr) |
49 | | If p = 0 Then '영자판이 아님 |
50 | | If Cho Then |
51 | | If Jung Then '초성+중성+(종성) |
52 | | ConvText = ConvText + MakeHan(Cho - 1, Jung - 1, Jong) |
53 | | Else '초성만 |
54 | | ConvText = ConvText + Mid(ChoDat, Cho, 1) |
55 | | End If |
56 | | Else |
57 | | If Jung Then '중성만 |
58 | | ConvText = ConvText + Mid(JungDat, Jung, 1) |
59 | | Else '복자음 |
60 | | If Jong Then ConvText = ConvText + Mid(JongDat, Jong, 1) |
61 | | End If |
62 | | End If |
63 | | Cho = 0: Jung = 0: Jong = 0 |
64 | | ConvText = ConvText + tChr |
65 | | ElseIf p < 20 Then '자음 |
66 | | If Jung Then |
67 | | If Cho = 0 Then '중성만 입력됨, 초성으로 |
68 | | ConvText = ConvText + Mid(JungDat, Jung, 1) |
69 | | Jung = 0 |
70 | | Cho = InStr(ChoDat, Mid(HanDat, p, 1)) |
71 | | Else '종성이다 |
72 | | If Jong = 0 Then '종성 입력 중 |
73 | | Jong = InStr(JongDat, Mid(HanDat, p, 1)) |
74 | | If Jong = 0 Then '종성이 아니라 초성이다 |
75 | | ConvText = ConvText + MakeHan(Cho - 1, Jung - 1, Jong) |
76 | | Cho = InStr(ChoDat, Mid(HanDat, p, 1)): Jung = 0 |
77 | | End If |
78 | | ElseIf Jong = 1 And p = 10 Then 'ㄳ |
79 | | Jong = 3 |
80 | | ElseIf Jong = 4 And p = 13 Then 'ㄵ |
81 | | Jong = 5 |
82 | | ElseIf Jong = 4 And p = 19 Then 'ㄶ |
83 | | Jong = 6 |
84 | | ElseIf Jong = 8 And p = 1 Then 'ㄺ |
85 | | Jong = 9 |
86 | | ElseIf Jong = 8 And p = 7 Then 'ㄻ |
87 | | Jong = 10 |
88 | | ElseIf Jong = 8 And p = 8 Then 'ㄼ |
89 | | Jong = 11 |
90 | | ElseIf Jong = 8 And p = 10 Then 'ㄽ |
91 | | Jong = 12 |
92 | | ElseIf Jong = 8 And p = 17 Then 'ㄾ |
93 | | Jong = 13 |
94 | | ElseIf Jong = 8 And p = 18 Then 'ㄿ |
95 | | Jong = 14 |
96 | | ElseIf Jong = 8 And p = 19 Then 'ㅀ |
97 | | Jong = 15 |
98 | | ElseIf Jong = 17 And p = 10 Then 'ㅄ |
99 | | Jong = 18 |
100 | | Else '종성 입력 끝, 초성으로 |
101 | | ConvText = ConvText + MakeHan(Cho - 1, Jung - 1, Jong) |
102 | | Cho = InStr(ChoDat, Mid(HanDat, p, 1)) |
103 | | Jung = 0: Jong = 0 |
104 | | End If |
105 | | End If |
106 | | Else '초성 또는 (단/복)자음이다 |
107 | | If Cho = 0 Then '초성 입력 시작 |
108 | | If Jong Then '복자음 후 초성 |
109 | | ConvText = ConvText + Mid(JongDat, Jong, 1) |
110 | | Jong = 0 |
111 | | End If |
112 | | Cho = InStr(ChoDat, Mid(HanDat, p, 1)) |
113 | | ElseIf Cho = 1 And p = 10 Then 'ㄳ |
114 | | Cho = 0: Jong = 3 |
115 | | ElseIf Cho = 3 And p = 13 Then 'ㄵ |
116 | | Cho = 0: Jong = 5 |
117 | | ElseIf Cho = 3 And p = 19 Then 'ㄶ |
118 | | Cho = 0: Jong = 6 |
119 | | ElseIf Cho = 6 And p = 1 Then 'ㄺ |
120 | | Cho = 0: Jong = 9 |
121 | | ElseIf Cho = 6 And p = 7 Then 'ㄻ |
122 | | Cho = 0: Jong = 10 |
123 | | ElseIf Cho = 6 And p = 8 Then 'ㄼ |
124 | | Cho = 0: Jong = 11 |
125 | | ElseIf Cho = 6 And p = 10 Then 'ㄽ |
126 | | Cho = 0: Jong = 12 |
127 | | ElseIf Cho = 6 And p = 17 Then 'ㄾ |
128 | | Cho = 0: Jong = 13 |
129 | | ElseIf Cho = 6 And p = 18 Then 'ㄿ |
130 | | Cho = 0: Jong = 14 |
131 | | ElseIf Cho = 6 And p = 19 Then 'ㅀ |
132 | | Cho = 0: Jong = 15 |
133 | | ElseIf Cho = 8 And p = 10 Then 'ㅄ |
134 | | Cho = 0: Jong = 18 |
135 | | Else '단자음을 연타 |
136 | | ConvText = ConvText + Mid(ChoDat, Cho, 1) |
137 | | Cho = InStr(ChoDat, Mid(HanDat, p, 1)) |
138 | | End If |
139 | | End If |
140 | | Else '중성 |
141 | | If Jong Then '(앞글자 종성), 초성+중성 |
142 | | Select Case Jong '복자음 다시 분해 |
143 | | Case 3: Jong = 1: tVal = 10 'ㄱ, ㅅ |
144 | | Case 5: Jong = 4: tVal = 13 'ㄴ, ㅈ |
145 | | Case 6: Jong = 4: tVal = 19 'ㄴ, ㅎ |
146 | | Case 9: Jong = 8: tVal = 1 'ㄹ, ㄱ |
147 | | Case 10: Jong = 8: tVal = 7 'ㄹ, ㅁ |
148 | | Case 11: Jong = 8: tVal = 8 'ㄹ, ㅂ |
149 | | Case 12: Jong = 8: tVal = 10 'ㄹ, ㅅ |
150 | | Case 13: Jong = 8: tVal = 17 'ㄹ, ㅌ |
151 | | Case 14: Jong = 8: tVal = 18 'ㄹ, ㅍ |
152 | | Case 15: Jong = 8: tVal = 19 'ㄹ, ㅎ |
153 | | Case 18: Jong = 17: tVal = 10 'ㅂ, ㅅ |
154 | | Case Else '복자음 아님 |
155 | | tVal = InStr(ChoDat, Mid(JongDat, Jong, 1)) |
156 | | Jong = 0 |
157 | | End Select |
158 | | If Cho Then '앞글자가 초성+중성+(종성) |
159 | | ConvText = ConvText + MakeHan(Cho - 1, Jung - 1, Jong) |
160 | | Else '복자음만 있음 |
161 | | ConvText = ConvText + Mid(JongDat, Jong, 1) |
162 | | End If |
163 | | Cho = tVal: Jung = 0: Jong = 0 |
164 | | End If |
165 | | If Jung = 0 Then '중성 입력 중 |
166 | | Jung = InStr(JungDat, Mid(HanDat, p, 1)) |
167 | | ElseIf Jung = 9 And p = 20 Then 'ㅘ |
168 | | Jung = 10 |
169 | | ElseIf Jung = 9 And p = 21 Then 'ㅙ |
170 | | Jung = 11 |
171 | | ElseIf Jung = 9 And p = 33 Then 'ㅚ |
172 | | Jung = 12 |
173 | | ElseIf Jung = 14 And p = 24 Then 'ㅝ |
174 | | Jung = 15 |
175 | | ElseIf Jung = 14 And p = 25 Then 'ㅞ |
176 | | Jung = 16 |
177 | | ElseIf Jung = 14 And p = 33 Then 'ㅟ |
178 | | Jung = 17 |
179 | | ElseIf Jung = 19 And p = 33 Then 'ㅢ |
180 | | Jung = 20 |
181 | | Else '조합 안되는 모음 입력 |
182 | | If Cho Then '초성+중성 후 중성 |
183 | | ConvText = ConvText + MakeHan(Cho - 1, Jung - 1, Jong) |
184 | | Cho = 0 |
185 | | Else '중성 후 중성 |
186 | | ConvText = ConvText + Mid(JungDat, Jung, 1) |
187 | | End If |
188 | | Jung = 0 |
189 | | ConvText = ConvText + Mid(HanDat, p, 1) |
190 | | End If |
191 | | End If |
192 | | Next |
193 | | If Cho Then '마지막 한글이 있으면 처리 |
194 | | If Jung Then '초성+중성+(종성) |
195 | | ConvText = ConvText + MakeHan(Cho - 1, Jung - 1, Jong) |
196 | | Else '초성만 |
197 | | ConvText = ConvText + Mid(ChoDat, Cho, 1) |
198 | | End If |
199 | | Else |
200 | | If Jung Then '중성만 |
201 | | ConvText = ConvText + Mid(JungDat, Jung, 1) |
202 | | Else '복자음 |
203 | | If Jong Then ConvText = ConvText + Mid(JongDat, Jong, 1) |
204 | | End If |
205 | | End If |
206 | | |
207 | | EngTypeToHan = ConvText |
208 | | End Function |
209 | | |
210 | | Function MakeHan(nChoSung, nJungSung, nJongSung) |
211 | | MakeHan = ChrW(&HAC00 + nChoSung * 21 * 28 + nJungSung * 28 + nJongSung) |
212 | | End Function |
213 | | |
214 | | Function HanTypeToEng(Source) |
215 | | Dim ConvText, tChr, tAsc |
216 | | Dim Jung, Cho, Jong, tVal(5) |
217 | | Dim i |
218 | | |
219 | | If Len(Source) = 0 Then Exit Function |
220 | | For i = 1 To Len(Source) |
221 | | tChr = Mid(Source, i, 1) |
222 | | tAsc = AscW(tChr) |
223 | | Cho = InStr(ChoDat, tChr) |
224 | | Jung = InStr(JungDat, tChr) |
225 | | Jong = InStr(JongDat, tChr) |
226 | | |
227 | | If &HAC00 <= tAsc And tAsc <= &HD7A3 Then |
228 | | tAsc = tAsc - &HAC00 |
229 | | tVal(1) = 1 + tAsc \ (21 * 28) '초성 |
230 | | tVal(2) = 1 + (tAsc \ 28) Mod 21 '중성 |
231 | | tVal(4) = tAsc Mod 28 '종성 |
232 | | ElseIf Cho Then '초성 자음 |
233 | | tVal(1) = Cho: tVal(2) = 0: tVal(4) = 0 |
234 | | ElseIf Jung Then '중성 |
235 | | tVal(1) = 0: tVal(2) = Jung: tVal(4) = 0 |
236 | | ElseIf Jong Then '종성 자음 |
237 | | tVal(1) = 0: tVal(2) = 0: tVal(4) = Jong |
238 | | Else '한글이 아님 |
239 | | ConvText = ConvText + tChr |
240 | | tVal(1) = 0: tVal(2) = 0: tVal(4) = 0 |
241 | | End If |
242 | | |
243 | | If tVal(1) Then ConvText = ConvText + Mid(EngDat, tVal(1), 1) |
244 | | If tVal(2) Then |
245 | | Select Case tVal(2) |
246 | | Case 10: tVal(2) = 9: tVal(3) = 1 'ㅘ |
247 | | Case 11: tVal(2) = 9: tVal(3) = 2 'ㅙ |
248 | | Case 12: tVal(2) = 9: tVal(3) = 14 'ㅚ |
249 | | Case 15: tVal(2) = 11: tVal(3) = 5 'ㅝ |
250 | | Case 16: tVal(2) = 11: tVal(3) = 6 'ㅞ |
251 | | Case 17: tVal(2) = 11: tVal(3) = 14 'ㅟ |
252 | | Case 20: tVal(2) = 13: tVal(3) = 14 'ㅢ |
253 | | Case Else |
254 | | tVal(2) = InStr(HanDat, Mid(JungDat, tVal(2), 1)) - 19 |
255 | | tVal(3) = 0 |
256 | | End Select |
257 | | ConvText = ConvText + Mid(EngDat, tVal(2) + 19, 1) |
258 | | If tVal(3) Then ConvText = ConvText + Mid(EngDat, tVal(3) + 19, 1) |
259 | | End If |
260 | | If tVal(4) Then |
261 | | Select Case tVal(4) |
262 | | Case 3: tVal(4) = 1: tVal(5) = 10 'ㄳ |
263 | | Case 5: tVal(4) = 3: tVal(5) = 13 'ㄵ |
264 | | Case 6: tVal(4) = 3: tVal(5) = 19 'ㄶ |
265 | | Case 9: tVal(4) = 6: tVal(5) = 1 'ㄺ |
266 | | Case 10: tVal(4) = 6: tVal(5) = 7 'ㄻ |
267 | | Case 11: tVal(4) = 6: tVal(5) = 8 'ㄼ |
268 | | Case 12: tVal(4) = 6: tVal(5) = 10 'ㄽ |
269 | | Case 13: tVal(4) = 6: tVal(5) = 17 'ㄾ |
270 | | Case 14: tVal(4) = 6: tVal(5) = 18 'ㄿ |
271 | | Case 15: tVal(4) = 6: tVal(5) = 19 'ㅀ |
272 | | Case 18: tVal(4) = 8: tVal(5) = 10 'ㅄ |
273 | | Case Else |
274 | | tVal(4) = InStr(HanDat, Mid(JongDat, tVal(4), 1)) |
275 | | tVal(5) = 0 |
276 | | End Select |
277 | | ConvText = ConvText + Mid(EngDat, tVal(4), 1) |
278 | | If tVal(5) Then ConvText = ConvText + Mid(EngDat, tVal(5), 1) |
279 | | End If |
280 | | Next |
281 | | |
282 | | HanTypeToEng = ConvText |
283 | | End Function |
| 22 | var ENG_KEY = "rRseEfaqQtTdwWczxvgkoiOjpuPhynbml"; |
| 23 | var KOR_KEY = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅛㅜㅠㅡㅣ"; |
| 24 | var CHO_DATA = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ"; |
| 25 | var JUNG_DATA = "ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ"; |
| 26 | var JONG_DATA = "ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ"; |
| 27 | |
| 28 | function doConvert() { |
| 29 | if (optEtoH.checked) |
| 30 | txtConv.value = engTypeToKor(txtSource.value); |
| 31 | else |
| 32 | txtConv.value = korTypeToEng(txtSource.value); |
| 33 | } |
| 34 | |
| 35 | function engTypeToKor(src) { |
| 36 | var res = ""; |
| 37 | if (src.length == 0) |
| 38 | return res; |
| 39 | |
| 40 | var nCho = -1, nJung = -1, nJong = -1; // 초성, 중성, 종성 |
| 41 | |
| 42 | for (var i = 0; i < src.length; i++) { |
| 43 | var ch = src.charAt(i); |
| 44 | var p = ENG_KEY.indexOf(ch); |
| 45 | if (p == -1) { // 영자판이 아님 |
| 46 | // 남아있는 한글이 있으면 처리 |
| 47 | if (nCho != -1) { |
| 48 | if (nJung != -1) // 초성+중성+(종성) |
| 49 | res += makeHangul(nCho, nJung, nJong); |
| 50 | else // 초성만 |
| 51 | res += CHO_DATA.charAt(nCho); |
| 52 | } else { |
| 53 | if (nJung != -1) // 중성만 |
| 54 | res += JUNG_DATA.charAt(nJung); |
| 55 | else if (nJong != -1) // 복자음 |
| 56 | res += JONG_DATA.charAt(nJong); |
| 57 | } |
| 58 | nCho = -1; |
| 59 | nJung = -1; |
| 60 | nJong = -1; |
| 61 | res += ch; |
| 62 | } else if (p < 19) { // 자음 |
| 63 | if (nJung != -1) { |
| 64 | if (nCho == -1) { // 중성만 입력됨, 초성으로 |
| 65 | res += JUNG_DATA.charAt(nJung); |
| 66 | nJung = -1; |
| 67 | nCho = CHO_DATA.indexOf(KOR_KEY.charAt(p)); |
| 68 | } else { // 종성이다 |
| 69 | if (nJong == -1) { // 종성 입력 중 |
| 70 | nJong = JONG_DATA.indexOf(KOR_KEY.charAt(p)); |
| 71 | if (nJong == -1) { // 종성이 아니라 초성이다 |
| 72 | res += makeHangul(nCho, nJung, nJong); |
| 73 | nCho = CHO_DATA.indexOf(KOR_KEY.charAt(p)); |
| 74 | nJung = -1; |
| 75 | } |
| 76 | } else if (nJong == 0 && p == 9) { // ㄳ |
| 77 | nJong = 2; |
| 78 | } else if (nJong == 3 && p == 12) { // ㄵ |
| 79 | nJong = 4; |
| 80 | } else if (nJong == 3 && p == 18) { // ㄶ |
| 81 | nJong = 5; |
| 82 | } else if (nJong == 7 && p == 0) { // ㄺ |
| 83 | nJong = 8; |
| 84 | } else if (nJong == 7 && p == 6) { // ㄻ |
| 85 | nJong = 9; |
| 86 | } else if (nJong == 7 && p == 7) { // ㄼ |
| 87 | nJong = 10; |
| 88 | } else if (nJong == 7 && p == 9) { // ㄽ |
| 89 | nJong = 11; |
| 90 | } else if (nJong == 7 && p == 16) { // ㄾ |
| 91 | nJong = 12; |
| 92 | } else if (nJong == 7 && p == 17) { // ㄿ |
| 93 | nJong = 13; |
| 94 | } else if (nJong == 7 && p == 18) { // ㅀ |
| 95 | nJong = 14; |
| 96 | } else if (nJong == 16 && p == 9) { // ㅄ |
| 97 | nJong = 17; |
| 98 | } else { // 종성 입력 끝, 초성으로 |
| 99 | res += makeHangul(nCho, nJung, nJong); |
| 100 | nCho = CHO_DATA.indexOf(KOR_KEY.charAt(p)); |
| 101 | nJung = -1; |
| 102 | nJong = -1; |
| 103 | } |
| 104 | } |
| 105 | } else { // 초성 또는 (단/복)자음이다 |
| 106 | if (nCho == -1) { // 초성 입력 시작 |
| 107 | if (nJong != -1) { // 복자음 후 초성 |
| 108 | res += JONG_DATA.charAt(nJong); |
| 109 | nJong = -1; |
| 110 | } |
| 111 | nCho = CHO_DATA.indexOf(KOR_KEY.charAt(p)); |
| 112 | } else if (nCho == 0 && p == 9) { // ㄳ |
| 113 | nCho = -1; |
| 114 | nJong = 2; |
| 115 | } else if (nCho == 2 && p == 12) { // ㄵ |
| 116 | nCho = -1; |
| 117 | nJong = 4; |
| 118 | } else if (nCho == 2 && p == 18) { // ㄶ |
| 119 | nCho = -1; |
| 120 | nJong = 5; |
| 121 | } else if (nCho == 5 && p == 0) { // ㄺ |
| 122 | nCho = -1; |
| 123 | nJong = 8; |
| 124 | } else if (nCho == 5 && p == 6) { // ㄻ |
| 125 | nCho = -1; |
| 126 | nJong = 9; |
| 127 | } else if (nCho == 5 && p == 7) { // ㄼ |
| 128 | nCho = -1; |
| 129 | nJong = 10; |
| 130 | } else if (nCho == 5 && p == 9) { // ㄽ |
| 131 | nCho = -1; |
| 132 | nJong = 11; |
| 133 | } else if (nCho == 5 && p == 16) { // ㄾ |
| 134 | nCho = -1; |
| 135 | nJong = 12; |
| 136 | } else if (nCho == 5 && p == 17) { // ㄿ |
| 137 | nCho = -1; |
| 138 | nJong = 13; |
| 139 | } else if (nCho == 5 && p == 18) { // ㅀ |
| 140 | nCho = -1; |
| 141 | nJong = 14; |
| 142 | } else if (nCho == 7 && p == 9) { // ㅄ |
| 143 | nCho = -1; |
| 144 | nJong = 17; |
| 145 | } else { // 단자음을 연타 |
| 146 | res += CHO_DATA.charAt(nCho); |
| 147 | nCho = CHO_DATA.indexOf(KOR_KEY.charAt(p)); |
| 148 | } |
| 149 | } |
| 150 | } else { // 모음 |
| 151 | if (nJong != -1) { // (앞글자 종성), 초성+중성 |
| 152 | // 복자음 다시 분해 |
| 153 | var newCho; // (임시용) 초성 |
| 154 | if (nJong == 2) { // ㄱ, ㅅ |
| 155 | nJong = 0; |
| 156 | newCho = 9; |
| 157 | } else if (nJong == 4) { // ㄴ, ㅈ |
| 158 | nJong = 3; |
| 159 | newCho = 12; |
| 160 | } else if (nJong == 5) { // ㄴ, ㅎ |
| 161 | nJong = 3; |
| 162 | newCho = 18; |
| 163 | } else if (nJong == 8) { // ㄹ, ㄱ |
| 164 | nJong = 7; |
| 165 | newCho = 0; |
| 166 | } else if (nJong == 9) { // ㄹ, ㅁ |
| 167 | nJong = 7; |
| 168 | newCho = 6; |
| 169 | } else if (nJong == 10) { // ㄹ, ㅂ |
| 170 | nJong = 7; |
| 171 | newCho = 7; |
| 172 | } else if (nJong == 11) { // ㄹ, ㅅ |
| 173 | nJong = 7; |
| 174 | newCho = 9; |
| 175 | } else if (nJong == 12) { // ㄹ, ㅌ |
| 176 | nJong = 7; |
| 177 | newCho = 16; |
| 178 | } else if (nJong == 13) { // ㄹ, ㅍ |
| 179 | nJong = 7; |
| 180 | newCho = 17; |
| 181 | } else if (nJong == 14) { // ㄹ, ㅎ |
| 182 | nJong = 7; |
| 183 | newCho = 18; |
| 184 | } else if (nJong == 17) { // ㅂ, ㅅ |
| 185 | nJong = 16; |
| 186 | newCho = 9; |
| 187 | } else { // 복자음 아님 |
| 188 | newCho = CHO_DATA.indexOf(JONG_DATA.charAt(nJong)); |
| 189 | nJong = -1; |
| 190 | } |
| 191 | if (nCho != -1) // 앞글자가 초성+중성+(종성) |
| 192 | res += makeHangul(nCho, nJung, nJong); |
| 193 | else // 복자음만 있음 |
| 194 | res += JONG_DATA.charAt(nJong); |
| 195 | |
| 196 | nCho = newCho; |
| 197 | nJung = -1; |
| 198 | nJong = -1; |
| 199 | } |
| 200 | if (nJung == -1) { // 중성 입력 중 |
| 201 | nJung = JUNG_DATA.indexOf(KOR_KEY.charAt(p)); |
| 202 | } else if (nJung == 8 && p == 19) { // ㅘ |
| 203 | nJung = 9; |
| 204 | } else if (nJung == 8 && p == 20) { // ㅙ |
| 205 | nJung = 10; |
| 206 | } else if (nJung == 8 && p == 32) { // ㅚ |
| 207 | nJung = 11; |
| 208 | } else if (nJung == 13 && p == 23) { // ㅝ |
| 209 | nJung = 14; |
| 210 | } else if (nJung == 13 && p == 24) { // ㅞ |
| 211 | nJung = 15; |
| 212 | } else if (nJung == 13 && p == 32) { // ㅟ |
| 213 | nJung = 16; |
| 214 | } else if (nJung == 18 && p == 32) { // ㅢ |
| 215 | nJung = 19; |
| 216 | } else { // 조합 안되는 모음 입력 |
| 217 | if (nCho != -1) { // 초성+중성 후 중성 |
| 218 | res += makeHangul(nCho, nJung, nJong); |
| 219 | nCho = -1; |
| 220 | } else // 중성 후 중성 |
| 221 | res += JUNG_DATA.charAt(nJung); |
| 222 | nJung = -1; |
| 223 | res += KOR_KEY.charAt(p); |
| 224 | } |
| 225 | } |
| 226 | } |
| 227 | |
| 228 | // 마지막 한글이 있으면 처리 |
| 229 | if (nCho != -1) { |
| 230 | if (nJung != -1) // 초성+중성+(종성) |
| 231 | res += makeHangul(nCho, nJung, nJong); |
| 232 | else // 초성만 |
| 233 | res += CHO_DATA.charAt(nCho); |
| 234 | } else { |
| 235 | if (nJung != -1) // 중성만 |
| 236 | res += JUNG_DATA.charAt(nJung); |
| 237 | else { // 복자음 |
| 238 | if (nJong != -1) |
| 239 | res += JONG_DATA.charAt(nJong); |
| 240 | } |
| 241 | } |
| 242 | |
| 243 | return res; |
| 244 | } |
| 245 | |
| 246 | function makeHangul(nCho, nJung, nJong) { |
| 247 | return String.fromCharCode(0xac00 + nCho * 21 * 28 + nJung * 28 + nJong + 1); |
| 248 | } |
| 249 | |
| 250 | function korTypeToEng(src) { |
| 251 | var res = ""; |
| 252 | if (src.length == 0) |
| 253 | return res; |
| 254 | |
| 255 | for (var i = 0; i < src.length; i++) { |
| 256 | var ch = src.charAt(i); |
| 257 | var nCode = ch.charCodeAt(0); |
| 258 | var nCho = CHO_DATA.indexOf(ch), nJung = JUNG_DATA.indexOf(ch), nJong = JONG_DATA.indexOf(ch); |
| 259 | var arrKeyIndex = [-1, -1, -1, -1, -1]; |
| 260 | |
| 261 | if (0xac00 <= nCode && nCode <= 0xd7a3) { |
| 262 | nCode -= 0xac00; |
| 263 | arrKeyIndex[0] = Math.floor(nCode / (21 * 28)); // 초성 |
| 264 | arrKeyIndex[1] = Math.floor(nCode / 28) % 21; // 중성 |
| 265 | arrKeyIndex[3] = nCode % 28 - 1; // 종성 |
| 266 | } else if (nCho != -1) // 초성 자음 |
| 267 | arrKeyIndex[0] = nCho; |
| 268 | else if (nJung != -1) // 중성 |
| 269 | arrKeyIndex[1] = nJung; |
| 270 | else if (nJong != -1) // 종성 자음 |
| 271 | arrKeyIndex[3] = nJong; |
| 272 | else // 한글이 아님 |
| 273 | res += ch; |
| 274 | |
| 275 | // 실제 Key Index로 변경. 초성은 순서 동일 |
| 276 | if (arrKeyIndex[1] != -1) { |
| 277 | if (arrKeyIndex[1] == 9) { // ㅘ |
| 278 | arrKeyIndex[1] = 27; |
| 279 | arrKeyIndex[2] = 19; |
| 280 | } else if (arrKeyIndex[1] == 10) { // ㅙ |
| 281 | arrKeyIndex[1] = 27; |
| 282 | arrKeyIndex[2] = 20; |
| 283 | } else if (arrKeyIndex[1] == 11) { // ㅚ |
| 284 | arrKeyIndex[1] = 27; |
| 285 | arrKeyIndex[2] = 32; |
| 286 | } else if (arrKeyIndex[1] == 14) { // ㅝ |
| 287 | arrKeyIndex[1] = 29; |
| 288 | arrKeyIndex[2] = 23; |
| 289 | } else if (arrKeyIndex[1] == 15) { // ㅞ |
| 290 | arrKeyIndex[1] = 29; |
| 291 | arrKeyIndex[2] = 24; |
| 292 | } else if (arrKeyIndex[1] == 16) { // ㅟ |
| 293 | arrKeyIndex[1] = 29; |
| 294 | arrKeyIndex[2] = 32; |
| 295 | } else if (arrKeyIndex[1] == 19) { // ㅢ |
| 296 | arrKeyIndex[1] = 31; |
| 297 | arrKeyIndex[2] = 32; |
| 298 | } else { |
| 299 | arrKeyIndex[1] = KOR_KEY.indexOf(JUNG_DATA.charAt(arrKeyIndex[1])); |
| 300 | arrKeyIndex[2] = -1; |
| 301 | } |
| 302 | } |
| 303 | if (arrKeyIndex[3] != -1) { |
| 304 | if (arrKeyIndex[3] == 2) { // ㄳ |
| 305 | arrKeyIndex[3] = 0 |
| 306 | arrKeyIndex[4] = 9; |
| 307 | } else if (arrKeyIndex[3] == 4) { // ㄵ |
| 308 | arrKeyIndex[3] = 2; |
| 309 | arrKeyIndex[4] = 12; |
| 310 | } else if (arrKeyIndex[3] == 5) { // ㄶ |
| 311 | arrKeyIndex[3] = 2; |
| 312 | arrKeyIndex[4] = 18; |
| 313 | } else if (arrKeyIndex[3] == 8) { // ㄺ |
| 314 | arrKeyIndex[3] = 5; |
| 315 | arrKeyIndex[4] = 0; |
| 316 | } else if (arrKeyIndex[3] == 9) { // ㄻ |
| 317 | arrKeyIndex[3] = 5; |
| 318 | arrKeyIndex[4] = 6; |
| 319 | } else if (arrKeyIndex[3] == 10) { // ㄼ |
| 320 | arrKeyIndex[3] = 5; |
| 321 | arrKeyIndex[4] = 7; |
| 322 | } else if (arrKeyIndex[3] == 11) { // ㄽ |
| 323 | arrKeyIndex[3] = 5; |
| 324 | arrKeyIndex[4] = 9; |
| 325 | } else if (arrKeyIndex[3] == 12) { // ㄾ |
| 326 | arrKeyIndex[3] = 5; |
| 327 | arrKeyIndex[4] = 16; |
| 328 | } else if (arrKeyIndex[3] == 13) { // ㄿ |
| 329 | arrKeyIndex[3] = 5; |
| 330 | arrKeyIndex[4] = 17; |
| 331 | } else if (arrKeyIndex[3] == 14) { // ㅀ |
| 332 | arrKeyIndex[3] = 5; |
| 333 | arrKeyIndex[4] = 18; |
| 334 | } else if (arrKeyIndex[3] == 17) { // ㅄ |
| 335 | arrKeyIndex[3] = 7; |
| 336 | arrKeyIndex[4] = 9; |
| 337 | } else { |
| 338 | arrKeyIndex[3] = KOR_KEY.indexOf(JONG_DATA.charAt(arrKeyIndex[3])); |
| 339 | arrKeyIndex[4] = -1; |
| 340 | } |
| 341 | } |
| 342 | |
| 343 | for (var j = 0; j < 5; j++) { |
| 344 | if (arrKeyIndex[j] != -1) |
| 345 | res += ENG_KEY.charAt(arrKeyIndex[j]); |
| 346 | } |
| 347 | } |
| 348 | |
| 349 | return res; |
| 350 | } |