완성 음절로 표현이 불가능한 경우 한글 자모로 표현
authorChoe Hwanjin <choe.hwanjin@gmail.com>
Sun, 19 Dec 2010 04:53:20 +0000 (13:53 +0900)
committerChoe Hwanjin <choe.hwanjin@gmail.com>
Sun, 19 Dec 2010 04:53:20 +0000 (13:53 +0900)
지금까지는 완성 음절로 표현이 불가능한 중성 + 종성 같은 음절의 경우
호환자모 중성과 종성을 나열하여 표현하였는데, 이제는 한글 자모 영역의
글자를 사용하여 초성채움 + 중성 + 종성으로 표현한다.
이렇게 기능을 수정하면, 옛한글 자판의 경우도 hangul_buffer_get_string()
함수를 그대로 사용할 수 있으므로 자판 관리가 좀더 편리해지는 측면이 있다.
그러나 단점으로 세벌식에서 모아치기 기능을 활용하는 중에 한글 자모로 표현한
글자가 나타날 수 있는데, 이때에 이 글자를 제대로 렌더링 하지 못할 가능성이
있다.

git-svn-id: http://kldp.net/svn/hangul/libhangul/trunk@233 8f00fcd2-89fc-0310-932e-b01be5b65e01

hangul/hangulinputcontext.c
test/test.c

index 90d0f7f7b9db4b3338956b07a0928dc63a68d951..a34646d1c016f2dc7b21b2f36e55e16107fd18e0 100644 (file)
@@ -610,38 +610,60 @@ hangul_jaso_to_string(ucschar cho, ucschar jung, ucschar jong,
        if (jung) {
            /* have cho, jung, jong or no jong */
            ch = hangul_jamo_to_syllable(cho, jung, jong);
-           buf[n++] = ch;
+           if (ch != 0) {
+               buf[n++] = ch;
+           } else {
+               /* 한글 음절로 표현 불가능한 경우 */
+               buf[n++] = cho;
+               buf[n++] = jung;
+               if (jong != 0)
+                   buf[n++] = jong;
+           }
        } else {
            if (jong) {
                /* have cho, jong */
-               ch = hangul_jamo_to_cjamo(cho);
-               buf[n++] = ch;
-               ch = hangul_jamo_to_cjamo(jong);
-               buf[n++] = ch;
+               buf[n++] = cho;
+               buf[n++] = HANGUL_JUNGSEONG_FILLER;
+               buf[n++] = jong;
            } else {
                /* have cho */
                ch = hangul_jamo_to_cjamo(cho);
-               buf[n++] = ch;
+               if (hangul_is_cjamo(ch)) {
+                   buf[n++] = ch;
+               } else {
+                   buf[n++] = cho;
+                   buf[n++] = HANGUL_JUNGSEONG_FILLER;
+               }
            }
        }
     } else {
        if (jung) {
            if (jong) {
                /* have jung, jong */
-               ch = hangul_jamo_to_cjamo(jung);
-               buf[n++] = ch;
-               ch = hangul_jamo_to_cjamo(jong);
-               buf[n++] = ch;
+               buf[n++] = HANGUL_CHOSEONG_FILLER;
+               buf[n++] = jung;
+               buf[n++] = jong;
            } else {
                /* have jung */
                ch = hangul_jamo_to_cjamo(jung);
-               buf[n++] = ch;
+               if (hangul_is_cjamo(ch)) {
+                   buf[n++] = ch;
+               } else {
+                   buf[n++] = HANGUL_CHOSEONG_FILLER;
+                   buf[n++] = jung;
+               }
            }
        } else {
            if (jong) { 
                /* have jong */
                ch = hangul_jamo_to_cjamo(jong);
-               buf[n++] = ch;
+               if (hangul_is_cjamo(ch)) {
+                   buf[n++] = ch;
+               } else {
+                   buf[n++] = HANGUL_CHOSEONG_FILLER;
+                   buf[n++] = HANGUL_JUNGSEONG_FILLER;
+                   buf[n++] = jong;
+               }
            } else {
                /* have nothing */
                buf[n] = 0;
index 2b4b85feb409dacd6c9881bb028472f396b27f39..ae20b6b8d5a676654864e57b4e10219b4e36969c 100644 (file)
@@ -1,3 +1,4 @@
+#include <stdarg.h>
 #include <stdlib.h>
 #include <check.h>
 
@@ -5,6 +6,64 @@
 
 #define countof(x)  ((sizeof(x)) / (sizeof(x[0])))
 
+static bool
+check_preedit(const char* keyboard, const char* input, ...)
+{
+    HangulInputContext* ic;
+    const char* p;
+    const ucschar* preedit;
+    ucschar code;
+    va_list ap;
+
+    ic = hangul_ic_new(keyboard);
+
+    p = input;
+    while (*p != '\0') {
+       hangul_ic_process(ic, *p);
+       p++;
+    }
+
+    preedit = hangul_ic_get_preedit_string(ic);
+
+    va_start(ap, input);
+
+    code = va_arg(ap, ucschar);
+    while (code != 0) {
+       if (*preedit != code)
+           return false;
+
+       code = va_arg(ap, ucschar);
+       preedit++;
+    }
+
+    va_end(ap);
+
+    hangul_ic_delete(ic);
+
+    return true;
+}
+
+START_TEST(test_hangul_ic_process_3f)
+{
+    /* L V T  */
+    /* ㅎ     */
+    fail_unless(check_preedit("3f", "m", 0x314e, 0));
+    /*   ㅗ   */
+    fail_unless(check_preedit("3f", "v", 0x3157, 0));
+    /*     ㅌ */
+    fail_unless(check_preedit("3f", "W", 0x314c, 0));
+
+    /* ㄱㅏㅇ */
+    fail_unless(check_preedit("3f", "kfa", 0xac15, 0));
+    /* ㄹㅐ   */
+    fail_unless(check_preedit("3f", "yr", 0xb798, 0));
+    /* ㄴ  ㅁ */
+    fail_unless(check_preedit("3f", "hz", 0x1102, 0x1160, 0x11b7, 0));
+    /*   ㅜㅅ */ 
+    fail_unless(check_preedit("3f", "tq", 0x115f, 0x1165, 0x11ba, 0));
+}
+END_TEST
+
 START_TEST(test_hangul_ic_process_romaja)
 {
     HangulInputContext* ic;
@@ -264,6 +323,7 @@ Suite* libhangul_suite()
     Suite* s = suite_create("libhangul");
 
     TCase* hangul = tcase_create("hangul");
+    tcase_add_test(hangul, test_hangul_ic_process_3f);
     tcase_add_test(hangul, test_hangul_ic_process_romaja);
     tcase_add_test(hangul, test_syllable_iterator);
     tcase_add_test(hangul, test_hangul_keyboard);