2 *******************************************************************************
\r
3 * Copyright (C) 2001-2010, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.test.translit;
\r
8 import java.util.Hashtable;
\r
10 import com.ibm.icu.impl.Utility;
\r
11 import com.ibm.icu.text.Transliterator;
\r
15 * @summary Test the Latin-Jamo transliterator
\r
17 public class JamoTest extends TransliteratorTest {
\r
19 public static void main(String[] args) throws Exception {
\r
20 new JamoTest().run(args);
\r
23 public void TestJamo() {
\r
24 Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
\r
25 Transliterator jamoLatin = latinJamo.getInverse();
\r
28 // Column 1 is the latin text L1 to be fed to Latin-Jamo
\r
29 // to yield output J.
\r
31 // Column 2 is expected value of J. J is fed to
\r
32 // Jamo-Latin to yield output L2.
\r
34 // Column 3 is expected value of L2. If the expected
\r
35 // value of L2 is L1, then L2 is null.
\r
37 // add tests for the update to fix problems where it didn't follow the standard
\r
38 // see also http://www.unicode.org/cldr/data/charts/transforms/Latin-Hangul.html
\r
39 "gach", "(Gi)(A)(Cf)", null,
\r
40 "geumhui", "(Gi)(EU)(Mf)(Hi)(YI)", null,
\r
41 "choe", "(Ci)(OE)", null,
\r
42 "wo", "(IEUNG)(WEO)", null,
\r
43 "Wonpil", "(IEUNG)(WEO)(Nf)(Pi)(I)(L)", "wonpil",
\r
44 "GIPPEUM", "(Gi)(I)(BB)(EU)(Mf)", "gippeum",
\r
45 "EUTTEUM", "(IEUNG)(EU)(DD)(EU)(Mf)", "eutteum",
\r
46 "KKOTNAE", "(GGi)(O)(Tf)(Ni)(AE)", "kkotnae",
\r
47 "gaga", "(Gi)(A)(Gi)(A)", null,
\r
48 "gag-a", "(Gi)(A)(Gf)(IEUNG)(A)", null,
\r
49 "gak-ka", "(Gi)(A)(Kf)(Ki)(A)", null,
\r
50 "gakka", "(Gi)(A)(GGi)(A)", null,
\r
51 "gakk-a", "(Gi)(A)(GGf)(IEUNG)(A)", null,
\r
52 "gakkka", "(Gi)(A)(GGf)(Ki)(A)", null,
\r
53 "gak-kka", "(Gi)(A)(Kf)(GGi)(A)", null,
\r
55 "bab", "(Bi)(A)(Bf)", null,
\r
56 "babb", "(Bi)(A)(Bf)(Bi)(EU)", "babbeu",
\r
57 "babbba", "(Bi)(A)(Bf)(Bi)(EU)(Bi)(A)", "babbeuba",
\r
58 "bagg", "(Bi)(A)(Gf)(Gi)(EU)", "baggeu",
\r
59 "baggga", "(Bi)(A)(Gf)(Gi)(EU)(Gi)(A)", "baggeuga",
\r
60 //"bag"+SEP+"gga", "(Bi)(A)(Gf)"+SEP+"(Gi)(EU)(Gi)(A)", "bag"+SEP+"geuga",
\r
61 "kabsa", "(Ki)(A)(Bf)(Si)(A)", null,
\r
62 "kabska", "(Ki)(A)(BS)(Ki)(A)", null,
\r
63 "gabsbka", "(Gi)(A)(BS)(Bi)(EU)(Ki)(A)", "gabsbeuka", // not (Kf)
\r
64 "gga", "(Gi)(EU)(Gi)(A)", "geuga",
\r
65 "bsa", "(Bi)(EU)(Si)(A)", "beusa",
\r
66 "agg", "(IEUNG)(A)(Gf)(Gi)(EU)", "aggeu",
\r
67 "agga", "(IEUNG)(A)(Gf)(Gi)(A)", null,
\r
68 "la", "(R)(A)", null,
\r
69 "bs", "(Bi)(EU)(Sf)", "beus",
\r
70 "kalgga", "(Ki)(A)(L)(Gi)(EU)(Gi)(A)", "kalgeuga",
\r
72 // 'r' in a final position is treated like 'l'
\r
73 "karka", "(Ki)(A)(L)(Ki)(A)", "kalka",
\r
77 for (int i=0; i<CASE.length; i+=3) {
\r
78 String jamo = nameToJamo(CASE[i+1]);
\r
79 if (CASE[i+2] == null) {
\r
80 expect(latinJamo, CASE[i], jamo, jamoLatin);
\r
82 // Handle case where round-trip is expected to fail
\r
83 expect(latinJamo, CASE[i], jamo);
\r
84 expect(jamoLatin, jamo, CASE[i+2]);
\r
90 * These are problems turned up by the Hangul-Jamo;Jamo-Latin
\r
93 public void TestRoundTrip() {
\r
94 String HANGUL[] = { "\uAC03\uC2F8",
\r
97 Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
\r
98 Transliterator jamoLatin = latinJamo.getInverse();
\r
99 Transliterator jamoHangul = Transliterator.getInstance("NFC");
\r
100 Transliterator hangulJamo = Transliterator.getInstance("NFD");
\r
102 StringBuffer buf = new StringBuffer();
\r
103 for (int i=0; i<HANGUL.length; ++i) {
\r
104 String hangul = HANGUL[i];
\r
105 String jamo = hangulJamo.transliterate(hangul);
\r
106 String latin = jamoLatin.transliterate(jamo);
\r
107 String jamo2 = latinJamo.transliterate(latin);
\r
108 String hangul2 = jamoHangul.transliterate(jamo2);
\r
110 buf.append(hangul + " => " +
\r
111 jamoToName(jamo) + " => " +
\r
112 latin + " => " + jamoToName(jamo2)
\r
115 if (!hangul.equals(hangul2)) {
\r
116 errln("FAIL: " + Utility.escape(buf.toString()));
\r
118 logln(Utility.escape(buf.toString()));
\r
124 * Test various step-at-a-time transformation of hangul to jamo to
\r
127 public void TestPiecemeal() {
\r
128 String hangul = "\uBC0F";
\r
129 String jamo = nameToJamo("(Mi)(I)(Cf)");
\r
130 String latin = "mic";
\r
131 String latin2 = "mich";
\r
133 Transliterator t = null;
\r
135 t = Transliterator.getInstance("NFD"); // was Hangul-Jamo
\r
136 expect(t, hangul, jamo);
\r
138 t = Transliterator.getInstance("NFC"); // was Jamo-Hangul
\r
139 expect(t, jamo, hangul);
\r
141 t = Transliterator.getInstance("Latin-Jamo");
\r
142 expect(t, latin, jamo);
\r
144 t = Transliterator.getInstance("Jamo-Latin");
\r
145 expect(t, jamo, latin2);
\r
147 t = Transliterator.getInstance("Hangul-Latin");
\r
148 expect(t, hangul, latin2);
\r
150 t = Transliterator.getInstance("Latin-Hangul");
\r
151 expect(t, latin, hangul);
\r
153 t = Transliterator.getInstance("Hangul-Latin; Latin-Jamo");
\r
154 expect(t, hangul, jamo);
\r
156 t = Transliterator.getInstance("Jamo-Latin; Latin-Hangul");
\r
157 expect(t, jamo, hangul);
\r
159 t = Transliterator.getInstance("Hangul-Latin; Latin-Hangul");
\r
160 expect(t, hangul, hangul);
\r
163 public void TestRealText() {
\r
164 Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo");
\r
165 Transliterator jamoLatin = latinJamo.getInverse();
\r
166 Transliterator jamoHangul = Transliterator.getInstance("NFC");
\r
167 Transliterator hangulJamo = Transliterator.getInstance("NFD");
\r
168 //Transliterator rt = new CompoundTransliterator(new Transliterator[] {
\r
169 // hangulJamo, jamoLatin, latinJamo, jamoHangul });
\r
170 Transliterator rt = Transliterator.getInstance("NFD;Jamo-Latin;Latin-Jamo;NFC");
\r
173 StringBuffer buf = new StringBuffer();
\r
176 while (pos < WHAT_IS_UNICODE.length()) {
\r
177 int space = WHAT_IS_UNICODE.indexOf(' ', pos+1);
\r
179 space = WHAT_IS_UNICODE.length();
\r
183 String hangul = WHAT_IS_UNICODE.substring(pos, space);
\r
184 String hangulX = rt.transliterate(hangul);
\r
185 if (!hangul.equals(hangulX)) {
\r
187 String jamo = hangulJamo.transliterate(hangul);
\r
188 String latin = jamoLatin.transliterate(jamo);
\r
189 String jamo2 = latinJamo.transliterate(latin);
\r
190 String hangul2 = jamoHangul.transliterate(jamo2);
\r
191 if (hangul.equals(hangul2)) {
\r
193 buf.append("FAIL (Compound transliterator problem): ");
\r
194 buf.append(hangul + " => " +
\r
195 jamoToName(jamo) + " => " +
\r
196 latin + " => " + jamoToName(jamo2)
\r
197 + " => " + hangul2 +
\r
198 "; but " + hangul + " =cpd=> " + jamoToName(hangulX)
\r
200 errln(Utility.escape(buf.toString()));
\r
201 } else if (jamo.equals(jamo2)) {
\r
203 buf.append("FAIL (Jamo<>Hangul problem): ");
\r
204 if (!hangul2.equals(hangulX)) {
\r
205 buf.append("(Weird: " + hangulX + " != " + hangul2 + ")");
\r
207 buf.append(hangul + " => " +
\r
208 jamoToName(jamo) + " => " +
\r
209 latin + " => " + jamoToName(jamo2)
\r
212 errln(Utility.escape(buf.toString()));
\r
215 buf.append("FAIL: ");
\r
216 if (!hangul2.equals(hangulX)) {
\r
217 buf.append("(Weird: " + hangulX + " != " + hangul2 + ")");
\r
219 // The Hangul-Jamo conversion is not usually the
\r
220 // bug here, so we hide it from display.
\r
221 // Uncomment lines to see the Hangul.
\r
222 buf.append(//hangul + " => " +
\r
223 jamoToName(jamo) + " => " +
\r
224 latin + " => " + jamoToName(jamo2)
\r
225 //+ " => " + hangul2
\r
227 errln(Utility.escape(buf.toString()));
\r
234 errln("Test word failures: " + errors + " out of " + total);
\r
236 logln("All " + total + " test words passed");
\r
240 // Test text taken from the Unicode web site
\r
241 static final String WHAT_IS_UNICODE =
\r
243 "\uc720\ub2c8\ucf54\ub4dc\uc5d0 \ub300\ud574 ? " +
\r
245 "\uc5b4\ub5a4 \ud50c\ub7ab\ud3fc, \uc5b4\ub5a4 " +
\r
246 "\ud504\ub85c\uadf8\ub7a8, \uc5b4\ub5a4 \uc5b8\uc5b4\uc5d0\ub3c4 " +
\r
247 "\uc0c1\uad00\uc5c6\uc774 \uc720\ub2c8\ucf54\ub4dc\ub294 \ubaa8\ub4e0 " +
\r
248 "\ubb38\uc790\uc5d0 \ub300\ud574 \uace0\uc720 \ubc88\ud638\ub97c " +
\r
249 "\uc81c\uacf5\ud569\ub2c8\ub2e4. " +
\r
251 "\uae30\ubcf8\uc801\uc73c\ub85c \ucef4\ud4e8\ud130\ub294 " +
\r
252 "\uc22b\uc790\ub9cc \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uae00\uc790\ub098 " +
\r
253 "\ub2e4\ub978 \ubb38\uc790\uc5d0\ub3c4 \uc22b\uc790\ub97c " +
\r
254 "\uc9c0\uc815\ud558\uc5ec " +
\r
255 "\uc800\uc7a5\ud569\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\uac00 " +
\r
256 "\uac1c\ubc1c\ub418\uae30 \uc804\uc5d0\ub294 \uc774\ub7ec\ud55c " +
\r
257 "\uc22b\uc790\ub97c \uc9c0\uc815\ud558\uae30 \uc704\ud574 \uc218\ubc31 " +
\r
258 "\uac00\uc9c0\uc758 \ub2e4\ub978 \uae30\ud638\ud654 " +
\r
259 "\uc2dc\uc2a4\ud15c\uc744 " +
\r
260 "\uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \ub2e8\uc77c \uae30\ud638\ud654 " +
\r
261 "\ubc29\ubc95\uc73c\ub85c\ub294 \ubaa8\ub4e0 \ubb38\uc790\ub97c " +
\r
262 "\ud3ec\ud568\ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. \uc608\ub97c " +
\r
263 "\ub4e4\uc5b4 \uc720\ub7fd \uc5f0\ud569\uc5d0\uc11c\ub9cc " +
\r
264 "\ubcf4\ub354\ub77c\ub3c4 \ubaa8\ub4e0 \uac01 \ub098\ub77c\ubcc4 " +
\r
265 "\uc5b8\uc5b4\ub97c \ucc98\ub9ac\ud558\ub824\uba74 \uc5ec\ub7ec " +
\r
266 "\uac1c\uc758 \ub2e4\ub978 \uae30\ud638\ud654 \ubc29\ubc95\uc774 " +
\r
267 "\ud544\uc694\ud569\ub2c8\ub2e4. \uc601\uc5b4\uc640 \uac19\uc740 " +
\r
268 "\ub2e8\uc77c \uc5b8\uc5b4\uc758 \uacbd\uc6b0\ub3c4 " +
\r
269 "\uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \ubaa8\ub4e0 " +
\r
270 "\uae00\uc790, \ubb38\uc7a5 \ubd80\ud638 \ubc0f " +
\r
271 "\ud14c\ud06c\ub2c8\uceec \uae30\ud638\uc5d0 \ub9de\ub294 \ub2e8\uc77c " +
\r
272 "\uae30\ud638\ud654 \ubc29\ubc95\uc744 \uac16\uace0 \uc788\uc9c0 " +
\r
273 "\ubabb\ud558\uc600\uc2b5\ub2c8\ub2e4. " +
\r
275 "\uc774\ub7ec\ud55c \uae30\ud638\ud654 \uc2dc\uc2a4\ud15c\uc740 " +
\r
276 "\ub610\ud55c \ub2e4\ub978 \uae30\ud638\ud654 \uc2dc\uc2a4\ud15c\uacfc " +
\r
277 "\ucda9\ub3cc\ud569\ub2c8\ub2e4. \uc989 \ub450 \uac00\uc9c0 " +
\r
278 "\uae30\ud638\ud654 \ubc29\ubc95\uc774 \ub450 \uac1c\uc758 \ub2e4\ub978 " +
\r
279 "\ubb38\uc790\uc5d0 \ub300\ud574 \uac19\uc740 \ubc88\ud638\ub97c " +
\r
280 "\uc0ac\uc6a9\ud558\uac70\ub098 \uac19\uc740 \ubb38\uc790\uc5d0 " +
\r
281 "\ub300\ud574 \ub2e4\ub978 \ubc88\ud638\ub97c \uc0ac\uc6a9\ud560 \uc218 " +
\r
282 "\uc788\uc2b5\ub2c8\ub2e4. \uc8fc\uc5b4\uc9c4 \ubaa8\ub4e0 " +
\r
283 "\ucef4\ud4e8\ud130(\ud2b9\ud788 \uc11c\ubc84)\ub294 \uc11c\ub85c " +
\r
284 "\ub2e4\ub978 \uc5ec\ub7ec \uac00\uc9c0 \uae30\ud638\ud654 " +
\r
285 "\ubc29\ubc95\uc744 \uc9c0\uc6d0\ud574\uc57c " +
\r
286 "\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098, \ub370\uc774\ud130\ub97c " +
\r
287 "\uc11c\ub85c \ub2e4\ub978 \uae30\ud638\ud654 \ubc29\ubc95\uc774\ub098 " +
\r
288 "\ud50c\ub7ab\ud3fc \uac04\uc5d0 \uc804\ub2ec\ud560 \ub54c\ub9c8\ub2e4 " +
\r
289 "\uadf8 \ub370\uc774\ud130\ub294 \ud56d\uc0c1 \uc190\uc0c1\uc758 " +
\r
290 "\uc704\ud5d8\uc744 \uacaa\uac8c \ub429\ub2c8\ub2e4. " +
\r
292 "\uc720\ub2c8\ucf54\ub4dc\ub85c \ubaa8\ub4e0 \uac83\uc744 " +
\r
293 "\ud574\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! " +
\r
294 "\uc720\ub2c8\ucf54\ub4dc\ub294 \uc0ac\uc6a9 \uc911\uc778 " +
\r
295 "\ud50c\ub7ab\ud3fc, \ud504\ub85c\uadf8\ub7a8, \uc5b8\uc5b4\uc5d0 " +
\r
296 "\uad00\uacc4\uc5c6\uc774 \ubb38\uc790\ub9c8\ub2e4 \uace0\uc720\ud55c " +
\r
297 "\uc22b\uc790\ub97c " +
\r
298 "\uc81c\uacf5\ud569\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " +
\r
299 "\ud45c\uc900\uc740 " + // "Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, " +
\r
300 // "Sun, Sybase, Unisys " +
\r
301 "\ubc0f \uae30\ud0c0 \uc5ec\ub7ec " +
\r
302 "\ud68c\uc0ac\uc640 \uac19\uc740 \uc5c5\uacc4 " +
\r
303 "\uc120\ub450\uc8fc\uc790\uc5d0 \uc758\ud574 " +
\r
304 "\ucc44\ud0dd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\ub294 " +
\r
305 // "XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML " +
\r
307 "\uac19\uc774 \ud604\uc7ac \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 " +
\r
308 "\ud45c\uc900\uc5d0\uc11c \ud544\uc694\ud558\uba70 \uc774\ub294 " + //ISO/IEC " +
\r
309 "10646\uc744 \uad6c\ud604\ud558\ub294 \uacf5\uc2dd\uc801\uc778 " +
\r
310 "\ubc29\ubc95\uc785\ub2c8\ub2e4. \uc774\ub294 \ub9ce\uc740 \uc6b4\uc601 " +
\r
311 "\uccb4\uc81c, \uc694\uc998 \uc0ac\uc6a9\ub418\ub294 \ubaa8\ub4e0 " +
\r
312 "\ube0c\ub77c\uc6b0\uc800 \ubc0f \uae30\ud0c0 \ub9ce\uc740 " +
\r
313 "\uc81c\ud488\uc5d0\uc11c " +
\r
314 "\uc9c0\uc6d0\ub429\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " +
\r
315 "\ud45c\uc900\uc758 \ubd80\uc0c1\uacfc \uc774\ub97c " +
\r
316 "\uc9c0\uc6d0\ud558\ub294 \ub3c4\uad6c\uc758 \uac00\uc6a9\uc131\uc740 " +
\r
317 "\ucd5c\uadfc \uc804 \uc138\uacc4\uc5d0 \ubd88\uace0 \uc788\ub294 " +
\r
318 "\uae30\uc220 \uacbd\ud5a5\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c " +
\r
319 "\ubd80\ubd84\uc744 \ucc28\uc9c0\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. " +
\r
321 "\uc720\ub2c8\ucf54\ub4dc\ub97c " +
\r
322 // Replaced a hyphen with a space to make the test case work with CLDR1.5
\r
323 // "\ud074\ub77c\uc774\uc5b8\ud2b8-\uc11c\ubc84 \ub610\ub294 " +
\r
324 "\ud074\ub77c\uc774\uc5b8\ud2b8 \uc11c\ubc84 \ub610\ub294 " +
\r
325 // Replaced a hyphen with a space.
\r
326 // "\ub2e4\uc911-\uc5f0\uacb0 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uacfc " +
\r
327 "\ub2e4\uc911 \uc5f0\uacb0 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uacfc " +
\r
328 "\uc6f9 \uc0ac\uc774\ud2b8\uc5d0 \ud1b5\ud569\ud558\uba74 " +
\r
329 "\ub808\uac70\uc2dc \ubb38\uc790 \uc138\ud2b8 \uc0ac\uc6a9\uc5d0 " +
\r
330 "\uc788\uc5b4\uc11c \uc0c1\ub2f9\ud55c \ube44\uc6a9 \uc808\uac10 " +
\r
331 "\ud6a8\uacfc\uac00 " +
\r
332 "\ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\ub97c " +
\r
333 "\ud1b5\ud574 \ub9ac\uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \uc5c6\uc774 " +
\r
334 "\ub2e4\uc911 \ud50c\ub7ab\ud3fc, \uc5b8\uc5b4 \ubc0f \uad6d\uac00 " +
\r
335 "\uac04\uc5d0 \ub2e8\uc77c \uc18c\ud504\ud2b8\uc6e8\uc5b4 " +
\r
336 "\ud50c\ub7ab\ud3fc \ub610\ub294 \ub2e8\uc77c \uc6f9 " +
\r
337 "\uc0ac\uc774\ud2b8\ub97c \ubaa9\ud45c\ub85c \uc0bc\uc744 \uc218 " +
\r
338 "\uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc0ac\uc6a9\ud558\uba74 " +
\r
339 "\ub370\uc774\ud130\ub97c \uc190\uc0c1 \uc5c6\uc774 \uc5ec\ub7ec " +
\r
340 "\uc2dc\uc2a4\ud15c\uc744 \ud1b5\ud574 \uc804\uc1a1\ud560 \uc218 " +
\r
341 "\uc788\uc2b5\ub2c8\ub2e4. " +
\r
343 "\uc720\ub2c8\ucf54\ub4dc \ucf58\uc18c\uc2dc\uc5c4\uc5d0 \ub300\ud574 " +
\r
344 "\uc720\ub2c8\ucf54\ub4dc \ucf58\uc18c\uc2dc\uc5c4\uc740 " +
\r
345 "\ube44\uc601\ub9ac \uc870\uc9c1\uc73c\ub85c\uc11c \ud604\ub300 " +
\r
346 "\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc81c\ud488\uacfc " +
\r
347 "\ud45c\uc900\uc5d0\uc11c \ud14d\uc2a4\ud2b8\uc758 \ud45c\ud604\uc744 " +
\r
348 "\uc9c0\uc815\ud558\ub294 \uc720\ub2c8\ucf54\ub4dc \ud45c\uc900\uc758 " +
\r
349 "\uc0ac\uc6a9\uc744 \uac1c\ubc1c\ud558\uace0 \ud655\uc7a5\ud558\uba70 " +
\r
350 "\uc7a5\ub824\ud558\uae30 \uc704\ud574 " +
\r
351 "\uc138\uc6cc\uc84c\uc2b5\ub2c8\ub2e4. \ucf58\uc18c\uc2dc\uc5c4 " +
\r
352 "\uba64\ubc84\uc27d\uc740 \ucef4\ud4e8\ud130\uc640 \uc815\ubcf4 " +
\r
353 "\ucc98\ub9ac \uc0b0\uc5c5\uc5d0 \uc885\uc0ac\ud558\uace0 \uc788\ub294 " +
\r
354 "\uad11\ubc94\uc704\ud55c \ud68c\uc0ac \ubc0f \uc870\uc9c1\uc758 " +
\r
355 "\ubc94\uc704\ub97c " +
\r
356 "\ub098\ud0c0\ub0c5\ub2c8\ub2e4. \ucf58\uc18c\uc2dc\uc5c4\uc758 " +
\r
357 "\uc7ac\uc815\uc740 \uc804\uc801\uc73c\ub85c \ud68c\ube44\uc5d0 " +
\r
358 "\uc758\ud574 \ucda9\ub2f9\ub429\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " +
\r
359 "\ucee8\uc18c\uc2dc\uc5c4\uc5d0\uc11c\uc758 \uba64\ubc84\uc27d\uc740 " +
\r
360 "\uc804 \uc138\uacc4 \uc5b4\ub290 \uacf3\uc5d0\uc11c\ub098 " +
\r
361 "\uc720\ub2c8\ucf54\ub4dc \ud45c\uc900\uc744 \uc9c0\uc6d0\ud558\uace0 " +
\r
362 "\uadf8 \ud655\uc7a5\uacfc \uad6c\ud604\uc744 " +
\r
363 "\uc9c0\uc6d0\ud558\uace0\uc790\ud558\ub294 \uc870\uc9c1\uacfc " +
\r
364 "\uac1c\uc778\uc5d0\uac8c \uac1c\ubc29\ub418\uc5b4 " +
\r
365 "\uc788\uc2b5\ub2c8\ub2e4. " +
\r
367 "\ub354 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc6a9\uc5b4\uc9d1, " +
\r
368 "\uc608\uc81c \uc720\ub2c8\ucf54\ub4dc \uc0ac\uc6a9 \uac00\ub2a5 " +
\r
369 "\uc81c\ud488, \uae30\uc220 \uc815\ubcf4 \ubc0f \uae30\ud0c0 " +
\r
370 "\uc720\uc6a9\ud55c \uc815\ubcf4\ub97c " +
\r
371 "\ucc38\uc870\ud558\uc2ed\uc2dc\uc624.";
\r
373 // TransliteratorTest override
\r
374 boolean expectAux(String tag, String summary, boolean pass,
\r
375 String expectedResult) {
\r
376 return super.expectAux(tag, jamoToName(summary),
\r
377 pass, jamoToName(expectedResult));
\r
382 // Note: The following could more easily be done with a transliterator!
\r
383 static final String[] JAMO_NAMES = {
\r
395 "(IEUNG)", "\u110B",
\r
455 static Hashtable JAMO_TO_NAME;
\r
456 static Hashtable NAME_TO_JAMO;
\r
459 JAMO_TO_NAME = new Hashtable();
\r
460 NAME_TO_JAMO = new Hashtable();
\r
461 for (int i=0; i<JAMO_NAMES.length; i+=2) {
\r
462 JAMO_TO_NAME.put(JAMO_NAMES[i+1], JAMO_NAMES[i]);
\r
463 NAME_TO_JAMO.put(JAMO_NAMES[i], JAMO_NAMES[i+1]);
\r
468 * Convert short names to actual jamo. E.g., "x(LG)y" returns
\r
469 * "x\u11B0y". See JAMO_NAMES for table of names.
\r
471 static String nameToJamo(String input) {
\r
472 StringBuffer buf = new StringBuffer();
\r
473 for (int i=0; i<input.length(); ++i) {
\r
474 char c = input.charAt(i);
\r
476 int j = input.indexOf(')', i+1);
\r
477 if ((j-i) >= 2 && (j-i) <= 6) { // "(A)", "(IEUNG)"
\r
478 String jamo = (String) NAME_TO_JAMO.get(input.substring(i, j+1));
\r
479 if (jamo != null) {
\r
488 return buf.toString();
\r
492 * Convert jamo to short names. E.g., "x\u11B0y" returns
\r
493 * "x(LG)y". See JAMO_NAMES for table of names.
\r
495 static String jamoToName(String input) {
\r
496 StringBuffer buf = new StringBuffer();
\r
497 for (int i=0; i<input.length(); ++i) {
\r
498 char c = input.charAt(i);
\r
499 if (c >= 0x1100 && c <= 0x11C2) {
\r
500 String name = (String) JAMO_TO_NAME.get(input.substring(i, i+1));
\r
501 if (name != null) {
\r
508 return buf.toString();
\r