| /** |
| ******************************************************************************* |
| * Copyright (C) 2001-2008, International Business Machines Corporation and * |
| * others. All Rights Reserved. * |
| ******************************************************************************* |
| */ |
| package com.ibm.icu.dev.test.translit; |
| import com.ibm.icu.text.*; |
| import com.ibm.icu.impl.Utility; |
| import java.util.*; |
| |
| /** |
| * @test |
| * @summary Test the Latin-Jamo transliterator |
| */ |
| public class JamoTest extends TransliteratorTest { |
| |
| public static void main(String[] args) throws Exception { |
| new JamoTest().run(args); |
| } |
| |
| public void TestJamo() { |
| Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo"); |
| Transliterator jamoLatin = latinJamo.getInverse(); |
| |
| String[] CASE = { |
| // Column 1 is the latin text L1 to be fed to Latin-Jamo |
| // to yield output J. |
| |
| // Column 2 is expected value of J. J is fed to |
| // Jamo-Latin to yield output L2. |
| |
| // Column 3 is expected value of L2. If the expected |
| // value of L2 is L1, then L2 is null. |
| |
| // add tests for the update to fix problems where it didn't follow the standard |
| // see also http://www.unicode.org/cldr/data/charts/transforms/Latin-Hangul.html |
| "gach", "(Gi)(A)(Cf)", null, |
| "geumhui", "(Gi)(EU)(Mf)(Hi)(YI)", null, |
| "choe", "(Ci)(OE)", null, |
| "wo", "(IEUNG)(WEO)", null, |
| "Wonpil", "(IEUNG)(WEO)(Nf)(Pi)(I)(L)", "wonpil", |
| "GIPPEUM", "(Gi)(I)(BB)(EU)(Mf)", "gippeum", |
| "EUTTEUM", "(IEUNG)(EU)(DD)(EU)(Mf)", "eutteum", |
| "KKOTNAE", "(GGi)(O)(Tf)(Ni)(AE)", "kkotnae", |
| "gaga", "(Gi)(A)(Gi)(A)", null, |
| "gag-a", "(Gi)(A)(Gf)(IEUNG)(A)", null, |
| "gak-ka", "(Gi)(A)(Kf)(Ki)(A)", null, |
| "gakka", "(Gi)(A)(GGi)(A)", null, |
| "gakk-a", "(Gi)(A)(GGf)(IEUNG)(A)", null, |
| "gakkka", "(Gi)(A)(GGf)(Ki)(A)", null, |
| "gak-kka", "(Gi)(A)(Kf)(GGi)(A)", null, |
| |
| "bab", "(Bi)(A)(Bf)", null, |
| "babb", "(Bi)(A)(Bf)(Bi)(EU)", "babbeu", |
| "babbba", "(Bi)(A)(Bf)(Bi)(EU)(Bi)(A)", "babbeuba", |
| "bagg", "(Bi)(A)(Gf)(Gi)(EU)", "baggeu", |
| "baggga", "(Bi)(A)(Gf)(Gi)(EU)(Gi)(A)", "baggeuga", |
| //"bag"+SEP+"gga", "(Bi)(A)(Gf)"+SEP+"(Gi)(EU)(Gi)(A)", "bag"+SEP+"geuga", |
| "kabsa", "(Ki)(A)(Bf)(Si)(A)", null, |
| "kabska", "(Ki)(A)(BS)(Ki)(A)", null, |
| "gabsbka", "(Gi)(A)(BS)(Bi)(EU)(Ki)(A)", "gabsbeuka", // not (Kf) |
| "gga", "(Gi)(EU)(Gi)(A)", "geuga", |
| "bsa", "(Bi)(EU)(Si)(A)", "beusa", |
| "agg", "(IEUNG)(A)(Gf)(Gi)(EU)", "aggeu", |
| "agga", "(IEUNG)(A)(Gf)(Gi)(A)", null, |
| "la", "(R)(A)", null, |
| "bs", "(Bi)(EU)(Sf)", "beus", |
| "kalgga", "(Ki)(A)(L)(Gi)(EU)(Gi)(A)", "kalgeuga", |
| |
| // 'r' in a final position is treated like 'l' |
| "karka", "(Ki)(A)(L)(Ki)(A)", "kalka", |
| |
| }; |
| |
| for (int i=0; i<CASE.length; i+=3) { |
| String jamo = nameToJamo(CASE[i+1]); |
| if (CASE[i+2] == null) { |
| expect(latinJamo, CASE[i], jamo, jamoLatin); |
| } else { |
| // Handle case where round-trip is expected to fail |
| expect(latinJamo, CASE[i], jamo); |
| expect(jamoLatin, jamo, CASE[i+2]); |
| } |
| } |
| } |
| |
| /** |
| * These are problems turned up by the Hangul-Jamo;Jamo-Latin |
| * round trip test. |
| */ |
| public void TestRoundTrip() { |
| String HANGUL[] = { "\uAC03\uC2F8", |
| "\uC544\uC5B4"}; |
| |
| Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo"); |
| Transliterator jamoLatin = latinJamo.getInverse(); |
| Transliterator jamoHangul = Transliterator.getInstance("NFC"); |
| Transliterator hangulJamo = Transliterator.getInstance("NFD"); |
| |
| StringBuffer buf = new StringBuffer(); |
| for (int i=0; i<HANGUL.length; ++i) { |
| String hangul = HANGUL[i]; |
| String jamo = hangulJamo.transliterate(hangul); |
| String latin = jamoLatin.transliterate(jamo); |
| String jamo2 = latinJamo.transliterate(latin); |
| String hangul2 = jamoHangul.transliterate(jamo2); |
| buf.setLength(0); |
| buf.append(hangul + " => " + |
| jamoToName(jamo) + " => " + |
| latin + " => " + jamoToName(jamo2) |
| + " => " + hangul2 |
| ); |
| if (!hangul.equals(hangul2)) { |
| errln("FAIL: " + Utility.escape(buf.toString())); |
| } else { |
| logln(Utility.escape(buf.toString())); |
| } |
| } |
| } |
| |
| /** |
| * Test various step-at-a-time transformation of hangul to jamo to |
| * latin and back. |
| */ |
| public void TestPiecemeal() { |
| String hangul = "\uBC0F"; |
| String jamo = nameToJamo("(Mi)(I)(Cf)"); |
| String latin = "mic"; |
| String latin2 = "mich"; |
| |
| Transliterator t = null; |
| |
| t = Transliterator.getInstance("NFD"); // was Hangul-Jamo |
| expect(t, hangul, jamo); |
| |
| t = Transliterator.getInstance("NFC"); // was Jamo-Hangul |
| expect(t, jamo, hangul); |
| |
| t = Transliterator.getInstance("Latin-Jamo"); |
| expect(t, latin, jamo); |
| |
| t = Transliterator.getInstance("Jamo-Latin"); |
| expect(t, jamo, latin2); |
| |
| t = Transliterator.getInstance("Hangul-Latin"); |
| expect(t, hangul, latin2); |
| |
| t = Transliterator.getInstance("Latin-Hangul"); |
| expect(t, latin, hangul); |
| |
| t = Transliterator.getInstance("Hangul-Latin; Latin-Jamo"); |
| expect(t, hangul, jamo); |
| |
| t = Transliterator.getInstance("Jamo-Latin; Latin-Hangul"); |
| expect(t, jamo, hangul); |
| |
| t = Transliterator.getInstance("Hangul-Latin; Latin-Hangul"); |
| expect(t, hangul, hangul); |
| } |
| |
| public void TestRealText() { |
| Transliterator latinJamo = Transliterator.getInstance("Latin-Jamo"); |
| Transliterator jamoLatin = latinJamo.getInverse(); |
| Transliterator jamoHangul = Transliterator.getInstance("NFC"); |
| Transliterator hangulJamo = Transliterator.getInstance("NFD"); |
| //Transliterator rt = new CompoundTransliterator(new Transliterator[] { |
| // hangulJamo, jamoLatin, latinJamo, jamoHangul }); |
| Transliterator rt = Transliterator.getInstance("NFD;Jamo-Latin;Latin-Jamo;NFC"); |
| |
| int pos = 0; |
| StringBuffer buf = new StringBuffer(); |
| int total = 0; |
| int errors = 0; |
| while (pos < WHAT_IS_UNICODE.length()) { |
| int space = WHAT_IS_UNICODE.indexOf(' ', pos+1); |
| if (space < 0) { |
| space = WHAT_IS_UNICODE.length(); |
| } |
| if (pos < space) { |
| ++total; |
| String hangul = WHAT_IS_UNICODE.substring(pos, space); |
| String hangulX = rt.transliterate(hangul); |
| if (!hangul.equals(hangulX)) { |
| ++errors; |
| String jamo = hangulJamo.transliterate(hangul); |
| String latin = jamoLatin.transliterate(jamo); |
| String jamo2 = latinJamo.transliterate(latin); |
| String hangul2 = jamoHangul.transliterate(jamo2); |
| if (hangul.equals(hangul2)) { |
| buf.setLength(0); |
| buf.append("FAIL (Compound transliterator problem): "); |
| buf.append(hangul + " => " + |
| jamoToName(jamo) + " => " + |
| latin + " => " + jamoToName(jamo2) |
| + " => " + hangul2 + |
| "; but " + hangul + " =cpd=> " + jamoToName(hangulX) |
| ); |
| errln(Utility.escape(buf.toString())); |
| } else if (jamo.equals(jamo2)) { |
| buf.setLength(0); |
| buf.append("FAIL (Jamo<>Hangul problem): "); |
| if (!hangul2.equals(hangulX)) { |
| buf.append("(Weird: " + hangulX + " != " + hangul2 + ")"); |
| } |
| buf.append(hangul + " => " + |
| jamoToName(jamo) + " => " + |
| latin + " => " + jamoToName(jamo2) |
| + " => " + hangul2 |
| ); |
| errln(Utility.escape(buf.toString())); |
| } else { |
| buf.setLength(0); |
| buf.append("FAIL: "); |
| if (!hangul2.equals(hangulX)) { |
| buf.append("(Weird: " + hangulX + " != " + hangul2 + ")"); |
| } |
| // The Hangul-Jamo conversion is not usually the |
| // bug here, so we hide it from display. |
| // Uncomment lines to see the Hangul. |
| buf.append(//hangul + " => " + |
| jamoToName(jamo) + " => " + |
| latin + " => " + jamoToName(jamo2) |
| //+ " => " + hangul2 |
| ); |
| errln(Utility.escape(buf.toString())); |
| } |
| } |
| } |
| pos = space+1; |
| } |
| if (errors != 0) { |
| errln("Test word failures: " + errors + " out of " + total); |
| } else { |
| logln("All " + total + " test words passed"); |
| } |
| } |
| |
| // Test text taken from the Unicode web site |
| static final String WHAT_IS_UNICODE = |
| |
| "\uc720\ub2c8\ucf54\ub4dc\uc5d0 \ub300\ud574 ? " + |
| |
| "\uc5b4\ub5a4 \ud50c\ub7ab\ud3fc, \uc5b4\ub5a4 " + |
| "\ud504\ub85c\uadf8\ub7a8, \uc5b4\ub5a4 \uc5b8\uc5b4\uc5d0\ub3c4 " + |
| "\uc0c1\uad00\uc5c6\uc774 \uc720\ub2c8\ucf54\ub4dc\ub294 \ubaa8\ub4e0 " + |
| "\ubb38\uc790\uc5d0 \ub300\ud574 \uace0\uc720 \ubc88\ud638\ub97c " + |
| "\uc81c\uacf5\ud569\ub2c8\ub2e4. " + |
| |
| "\uae30\ubcf8\uc801\uc73c\ub85c \ucef4\ud4e8\ud130\ub294 " + |
| "\uc22b\uc790\ub9cc \ucc98\ub9ac\ud569\ub2c8\ub2e4. \uae00\uc790\ub098 " + |
| "\ub2e4\ub978 \ubb38\uc790\uc5d0\ub3c4 \uc22b\uc790\ub97c " + |
| "\uc9c0\uc815\ud558\uc5ec " + |
| "\uc800\uc7a5\ud569\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\uac00 " + |
| "\uac1c\ubc1c\ub418\uae30 \uc804\uc5d0\ub294 \uc774\ub7ec\ud55c " + |
| "\uc22b\uc790\ub97c \uc9c0\uc815\ud558\uae30 \uc704\ud574 \uc218\ubc31 " + |
| "\uac00\uc9c0\uc758 \ub2e4\ub978 \uae30\ud638\ud654 " + |
| "\uc2dc\uc2a4\ud15c\uc744 " + |
| "\uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \ub2e8\uc77c \uae30\ud638\ud654 " + |
| "\ubc29\ubc95\uc73c\ub85c\ub294 \ubaa8\ub4e0 \ubb38\uc790\ub97c " + |
| "\ud3ec\ud568\ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. \uc608\ub97c " + |
| "\ub4e4\uc5b4 \uc720\ub7fd \uc5f0\ud569\uc5d0\uc11c\ub9cc " + |
| "\ubcf4\ub354\ub77c\ub3c4 \ubaa8\ub4e0 \uac01 \ub098\ub77c\ubcc4 " + |
| "\uc5b8\uc5b4\ub97c \ucc98\ub9ac\ud558\ub824\uba74 \uc5ec\ub7ec " + |
| "\uac1c\uc758 \ub2e4\ub978 \uae30\ud638\ud654 \ubc29\ubc95\uc774 " + |
| "\ud544\uc694\ud569\ub2c8\ub2e4. \uc601\uc5b4\uc640 \uac19\uc740 " + |
| "\ub2e8\uc77c \uc5b8\uc5b4\uc758 \uacbd\uc6b0\ub3c4 " + |
| "\uacf5\ud1b5\uc801\uc73c\ub85c \uc0ac\uc6a9\ub418\ub294 \ubaa8\ub4e0 " + |
| "\uae00\uc790, \ubb38\uc7a5 \ubd80\ud638 \ubc0f " + |
| "\ud14c\ud06c\ub2c8\uceec \uae30\ud638\uc5d0 \ub9de\ub294 \ub2e8\uc77c " + |
| "\uae30\ud638\ud654 \ubc29\ubc95\uc744 \uac16\uace0 \uc788\uc9c0 " + |
| "\ubabb\ud558\uc600\uc2b5\ub2c8\ub2e4. " + |
| |
| "\uc774\ub7ec\ud55c \uae30\ud638\ud654 \uc2dc\uc2a4\ud15c\uc740 " + |
| "\ub610\ud55c \ub2e4\ub978 \uae30\ud638\ud654 \uc2dc\uc2a4\ud15c\uacfc " + |
| "\ucda9\ub3cc\ud569\ub2c8\ub2e4. \uc989 \ub450 \uac00\uc9c0 " + |
| "\uae30\ud638\ud654 \ubc29\ubc95\uc774 \ub450 \uac1c\uc758 \ub2e4\ub978 " + |
| "\ubb38\uc790\uc5d0 \ub300\ud574 \uac19\uc740 \ubc88\ud638\ub97c " + |
| "\uc0ac\uc6a9\ud558\uac70\ub098 \uac19\uc740 \ubb38\uc790\uc5d0 " + |
| "\ub300\ud574 \ub2e4\ub978 \ubc88\ud638\ub97c \uc0ac\uc6a9\ud560 \uc218 " + |
| "\uc788\uc2b5\ub2c8\ub2e4. \uc8fc\uc5b4\uc9c4 \ubaa8\ub4e0 " + |
| "\ucef4\ud4e8\ud130(\ud2b9\ud788 \uc11c\ubc84)\ub294 \uc11c\ub85c " + |
| "\ub2e4\ub978 \uc5ec\ub7ec \uac00\uc9c0 \uae30\ud638\ud654 " + |
| "\ubc29\ubc95\uc744 \uc9c0\uc6d0\ud574\uc57c " + |
| "\ud569\ub2c8\ub2e4. \uadf8\ub7ec\ub098, \ub370\uc774\ud130\ub97c " + |
| "\uc11c\ub85c \ub2e4\ub978 \uae30\ud638\ud654 \ubc29\ubc95\uc774\ub098 " + |
| "\ud50c\ub7ab\ud3fc \uac04\uc5d0 \uc804\ub2ec\ud560 \ub54c\ub9c8\ub2e4 " + |
| "\uadf8 \ub370\uc774\ud130\ub294 \ud56d\uc0c1 \uc190\uc0c1\uc758 " + |
| "\uc704\ud5d8\uc744 \uacaa\uac8c \ub429\ub2c8\ub2e4. " + |
| |
| "\uc720\ub2c8\ucf54\ub4dc\ub85c \ubaa8\ub4e0 \uac83\uc744 " + |
| "\ud574\uacb0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4! " + |
| "\uc720\ub2c8\ucf54\ub4dc\ub294 \uc0ac\uc6a9 \uc911\uc778 " + |
| "\ud50c\ub7ab\ud3fc, \ud504\ub85c\uadf8\ub7a8, \uc5b8\uc5b4\uc5d0 " + |
| "\uad00\uacc4\uc5c6\uc774 \ubb38\uc790\ub9c8\ub2e4 \uace0\uc720\ud55c " + |
| "\uc22b\uc790\ub97c " + |
| "\uc81c\uacf5\ud569\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " + |
| "\ud45c\uc900\uc740 " + // "Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, " + |
| // "Sun, Sybase, Unisys " + |
| "\ubc0f \uae30\ud0c0 \uc5ec\ub7ec " + |
| "\ud68c\uc0ac\uc640 \uac19\uc740 \uc5c5\uacc4 " + |
| "\uc120\ub450\uc8fc\uc790\uc5d0 \uc758\ud574 " + |
| "\ucc44\ud0dd\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\ub294 " + |
| // "XML, Java, ECMAScript(JavaScript), LDAP, CORBA 3.0, WML " + |
| "\ub4f1\uacfc " + |
| "\uac19\uc774 \ud604\uc7ac \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 " + |
| "\ud45c\uc900\uc5d0\uc11c \ud544\uc694\ud558\uba70 \uc774\ub294 " + //ISO/IEC " + |
| "10646\uc744 \uad6c\ud604\ud558\ub294 \uacf5\uc2dd\uc801\uc778 " + |
| "\ubc29\ubc95\uc785\ub2c8\ub2e4. \uc774\ub294 \ub9ce\uc740 \uc6b4\uc601 " + |
| "\uccb4\uc81c, \uc694\uc998 \uc0ac\uc6a9\ub418\ub294 \ubaa8\ub4e0 " + |
| "\ube0c\ub77c\uc6b0\uc800 \ubc0f \uae30\ud0c0 \ub9ce\uc740 " + |
| "\uc81c\ud488\uc5d0\uc11c " + |
| "\uc9c0\uc6d0\ub429\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " + |
| "\ud45c\uc900\uc758 \ubd80\uc0c1\uacfc \uc774\ub97c " + |
| "\uc9c0\uc6d0\ud558\ub294 \ub3c4\uad6c\uc758 \uac00\uc6a9\uc131\uc740 " + |
| "\ucd5c\uadfc \uc804 \uc138\uacc4\uc5d0 \ubd88\uace0 \uc788\ub294 " + |
| "\uae30\uc220 \uacbd\ud5a5\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c " + |
| "\ubd80\ubd84\uc744 \ucc28\uc9c0\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. " + |
| |
| "\uc720\ub2c8\ucf54\ub4dc\ub97c " + |
| // Replaced a hyphen with a space to make the test case work with CLDR1.5 |
| // "\ud074\ub77c\uc774\uc5b8\ud2b8-\uc11c\ubc84 \ub610\ub294 " + |
| "\ud074\ub77c\uc774\uc5b8\ud2b8 \uc11c\ubc84 \ub610\ub294 " + |
| // Replaced a hyphen with a space. |
| // "\ub2e4\uc911-\uc5f0\uacb0 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uacfc " + |
| "\ub2e4\uc911 \uc5f0\uacb0 \uc751\uc6a9 \ud504\ub85c\uadf8\ub7a8\uacfc " + |
| "\uc6f9 \uc0ac\uc774\ud2b8\uc5d0 \ud1b5\ud569\ud558\uba74 " + |
| "\ub808\uac70\uc2dc \ubb38\uc790 \uc138\ud2b8 \uc0ac\uc6a9\uc5d0 " + |
| "\uc788\uc5b4\uc11c \uc0c1\ub2f9\ud55c \ube44\uc6a9 \uc808\uac10 " + |
| "\ud6a8\uacfc\uac00 " + |
| "\ub098\ud0c0\ub0a9\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc\ub97c " + |
| "\ud1b5\ud574 \ub9ac\uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \uc5c6\uc774 " + |
| "\ub2e4\uc911 \ud50c\ub7ab\ud3fc, \uc5b8\uc5b4 \ubc0f \uad6d\uac00 " + |
| "\uac04\uc5d0 \ub2e8\uc77c \uc18c\ud504\ud2b8\uc6e8\uc5b4 " + |
| "\ud50c\ub7ab\ud3fc \ub610\ub294 \ub2e8\uc77c \uc6f9 " + |
| "\uc0ac\uc774\ud2b8\ub97c \ubaa9\ud45c\ub85c \uc0bc\uc744 \uc218 " + |
| "\uc788\uc2b5\ub2c8\ub2e4. \uc774\ub97c \uc0ac\uc6a9\ud558\uba74 " + |
| "\ub370\uc774\ud130\ub97c \uc190\uc0c1 \uc5c6\uc774 \uc5ec\ub7ec " + |
| "\uc2dc\uc2a4\ud15c\uc744 \ud1b5\ud574 \uc804\uc1a1\ud560 \uc218 " + |
| "\uc788\uc2b5\ub2c8\ub2e4. " + |
| |
| "\uc720\ub2c8\ucf54\ub4dc \ucf58\uc18c\uc2dc\uc5c4\uc5d0 \ub300\ud574 " + |
| "\uc720\ub2c8\ucf54\ub4dc \ucf58\uc18c\uc2dc\uc5c4\uc740 " + |
| "\ube44\uc601\ub9ac \uc870\uc9c1\uc73c\ub85c\uc11c \ud604\ub300 " + |
| "\uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc81c\ud488\uacfc " + |
| "\ud45c\uc900\uc5d0\uc11c \ud14d\uc2a4\ud2b8\uc758 \ud45c\ud604\uc744 " + |
| "\uc9c0\uc815\ud558\ub294 \uc720\ub2c8\ucf54\ub4dc \ud45c\uc900\uc758 " + |
| "\uc0ac\uc6a9\uc744 \uac1c\ubc1c\ud558\uace0 \ud655\uc7a5\ud558\uba70 " + |
| "\uc7a5\ub824\ud558\uae30 \uc704\ud574 " + |
| "\uc138\uc6cc\uc84c\uc2b5\ub2c8\ub2e4. \ucf58\uc18c\uc2dc\uc5c4 " + |
| "\uba64\ubc84\uc27d\uc740 \ucef4\ud4e8\ud130\uc640 \uc815\ubcf4 " + |
| "\ucc98\ub9ac \uc0b0\uc5c5\uc5d0 \uc885\uc0ac\ud558\uace0 \uc788\ub294 " + |
| "\uad11\ubc94\uc704\ud55c \ud68c\uc0ac \ubc0f \uc870\uc9c1\uc758 " + |
| "\ubc94\uc704\ub97c " + |
| "\ub098\ud0c0\ub0c5\ub2c8\ub2e4. \ucf58\uc18c\uc2dc\uc5c4\uc758 " + |
| "\uc7ac\uc815\uc740 \uc804\uc801\uc73c\ub85c \ud68c\ube44\uc5d0 " + |
| "\uc758\ud574 \ucda9\ub2f9\ub429\ub2c8\ub2e4. \uc720\ub2c8\ucf54\ub4dc " + |
| "\ucee8\uc18c\uc2dc\uc5c4\uc5d0\uc11c\uc758 \uba64\ubc84\uc27d\uc740 " + |
| "\uc804 \uc138\uacc4 \uc5b4\ub290 \uacf3\uc5d0\uc11c\ub098 " + |
| "\uc720\ub2c8\ucf54\ub4dc \ud45c\uc900\uc744 \uc9c0\uc6d0\ud558\uace0 " + |
| "\uadf8 \ud655\uc7a5\uacfc \uad6c\ud604\uc744 " + |
| "\uc9c0\uc6d0\ud558\uace0\uc790\ud558\ub294 \uc870\uc9c1\uacfc " + |
| "\uac1c\uc778\uc5d0\uac8c \uac1c\ubc29\ub418\uc5b4 " + |
| "\uc788\uc2b5\ub2c8\ub2e4. " + |
| |
| "\ub354 \uc790\uc138\ud55c \ub0b4\uc6a9\uc740 \uc6a9\uc5b4\uc9d1, " + |
| "\uc608\uc81c \uc720\ub2c8\ucf54\ub4dc \uc0ac\uc6a9 \uac00\ub2a5 " + |
| "\uc81c\ud488, \uae30\uc220 \uc815\ubcf4 \ubc0f \uae30\ud0c0 " + |
| "\uc720\uc6a9\ud55c \uc815\ubcf4\ub97c " + |
| "\ucc38\uc870\ud558\uc2ed\uc2dc\uc624."; |
| |
| // TransliteratorTest override |
| boolean expectAux(String tag, String summary, boolean pass, |
| String expectedResult) { |
| return super.expectAux(tag, jamoToName(summary), |
| pass, jamoToName(expectedResult)); |
| } |
| |
| // UTILITIES |
| |
| // Note: The following could more easily be done with a transliterator! |
| static final String[] JAMO_NAMES = { |
| "(Gi)", "\u1100", |
| "(GGi)", "\u1101", |
| "(Ni)", "\u1102", |
| "(Di)", "\u1103", |
| "(DD)", "\u1104", |
| "(R)", "\u1105", |
| "(Mi)", "\u1106", |
| "(Bi)", "\u1107", |
| "(BB)", "\u1108", |
| "(Si)", "\u1109", |
| "(SSi)", "\u110A", |
| "(IEUNG)", "\u110B", |
| "(Ji)", "\u110C", |
| "(JJ)", "\u110D", |
| "(Ci)", "\u110E", |
| "(Ki)", "\u110F", |
| "(Ti)", "\u1110", |
| "(Pi)", "\u1111", |
| "(Hi)", "\u1112", |
| |
| "(A)", "\u1161", |
| "(AE)", "\u1162", |
| "(YA)", "\u1163", |
| "(YAE)", "\u1164", |
| "(EO)", "\u1165", |
| "(E)", "\u1166", |
| "(YEO)", "\u1167", |
| "(YE)", "\u1168", |
| "(O)", "\u1169", |
| "(WA)", "\u116A", |
| "(WAE)", "\u116B", |
| "(OE)", "\u116C", |
| "(YO)", "\u116D", |
| "(U)", "\u116E", |
| "(WEO)", "\u116F", |
| "(WE)", "\u1170", |
| "(WI)", "\u1171", |
| "(YU)", "\u1172", |
| "(EU)", "\u1173", |
| "(YI)", "\u1174", |
| "(I)", "\u1175", |
| |
| "(Gf)", "\u11A8", |
| "(GGf)", "\u11A9", |
| "(GS)", "\u11AA", |
| "(Nf)", "\u11AB", |
| "(NJ)", "\u11AC", |
| "(NH)", "\u11AD", |
| "(Df)", "\u11AE", |
| "(L)", "\u11AF", |
| "(LG)", "\u11B0", |
| "(LM)", "\u11B1", |
| "(LB)", "\u11B2", |
| "(LS)", "\u11B3", |
| "(LT)", "\u11B4", |
| "(LP)", "\u11B5", |
| "(LH)", "\u11B6", |
| "(Mf)", "\u11B7", |
| "(Bf)", "\u11B8", |
| "(BS)", "\u11B9", |
| "(Sf)", "\u11BA", |
| "(SSf)", "\u11BB", |
| "(NG)", "\u11BC", |
| "(Jf)", "\u11BD", |
| "(Cf)", "\u11BE", |
| "(Kf)", "\u11BF", |
| "(Tf)", "\u11C0", |
| "(Pf)", "\u11C1", |
| "(Hf)", "\u11C2", |
| }; |
| |
| static Hashtable JAMO_TO_NAME; |
| static Hashtable NAME_TO_JAMO; |
| |
| static { |
| JAMO_TO_NAME = new Hashtable(); |
| NAME_TO_JAMO = new Hashtable(); |
| for (int i=0; i<JAMO_NAMES.length; i+=2) { |
| JAMO_TO_NAME.put(JAMO_NAMES[i+1], JAMO_NAMES[i]); |
| NAME_TO_JAMO.put(JAMO_NAMES[i], JAMO_NAMES[i+1]); |
| } |
| } |
| |
| /** |
| * Convert short names to actual jamo. E.g., "x(LG)y" returns |
| * "x\u11B0y". See JAMO_NAMES for table of names. |
| */ |
| static String nameToJamo(String input) { |
| StringBuffer buf = new StringBuffer(); |
| for (int i=0; i<input.length(); ++i) { |
| char c = input.charAt(i); |
| if (c == '(') { |
| int j = input.indexOf(')', i+1); |
| if ((j-i) >= 2 && (j-i) <= 6) { // "(A)", "(IEUNG)" |
| String jamo = (String) NAME_TO_JAMO.get(input.substring(i, j+1)); |
| if (jamo != null) { |
| buf.append(jamo); |
| i = j; |
| continue; |
| } |
| } |
| } |
| buf.append(c); |
| } |
| return buf.toString(); |
| } |
| |
| /** |
| * Convert jamo to short names. E.g., "x\u11B0y" returns |
| * "x(LG)y". See JAMO_NAMES for table of names. |
| */ |
| static String jamoToName(String input) { |
| StringBuffer buf = new StringBuffer(); |
| for (int i=0; i<input.length(); ++i) { |
| char c = input.charAt(i); |
| if (c >= 0x1100 && c <= 0x11C2) { |
| String name = (String) JAMO_TO_NAME.get(input.substring(i, i+1)); |
| if (name != null) { |
| buf.append(name); |
| continue; |
| } |
| } |
| buf.append(c); |
| } |
| return buf.toString(); |
| } |
| } |