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