package kr.kangwoo.util.hangul; import java.util.HashMap; import java.util.Map; /** *
À¯´ÏÄÚµå(Unicode) ±â¹ÝÀ¸·Î ¸¸µç ÇÑ±Û °ü·Ã Ŭ·¡½ºÀÔ´Ï´Ù.
* * *À¯´ÏÄÚµå(Unicode)´Â Àü¼¼°èÀÇ ¸ðµç ¹®ÀÚ¸¦ ÄÄÇ»ÅÍ¿¡¼ ÀϰüµÇ°Ô Ç¥ÇöÇÏ°í ´Ù·ê ¼ö ÀÖµµ·Ï ¼³°èÇÑ Ç¥ÁØÀÔ´Ï´Ù. *
* *À¯´ÏÄÚµå CharacterSet¿¡¼ ÇѱÛÀÌ Â÷ÁöÇÏ´Â ¿µ¿ªÀº ¼¼ °³·Î ³ª´ ¼ö ÀÖ½À´Ï´Ù. * ù¹øÂ°´Â 0x1100-0x11F9 ±îÁöÀÇ ÇÑ±Û Àڸ𠿵¿ª. Çѱۿ¡¼ »ç¿ëµÇ´Â ÀÚ¸ðµéÀ» Ãʼº ÀÚÀ½/Áß¼º ¸ðÀ½/Á¾¼º ÀÚÀ½À¸·Î °¢°¢ ³ª´©¾î ÇѱÛÀÚ¾¿ ´ëÀÀ½Ãŵ´Ï´Ù. * ÀÌ ¿µ¿ª¿¡ ÀÖ´Â ±ÛÀÚµéÀ» ÀÌ¿ëÇϸé ÇÑ±Û °í¾î±îÁö Ç¥ÇöÀÌ °¡´ÉÇØÁý´Ï´Ù. ij¸¯Åͼ º¯È¯ÀÌ ¾î·Æ´Ù´Â ´ÜÁ¡ÀÌ ÀÖ½À´Ï´Ù. * µÎ¹øÂ°´Â 0x3130-0x318E ±îÁöÀÇ ÇÑ±Û È£È¯ Àڸ𠿵¿ª. ÀÌ ºÎºÐÀº ÃÊ/Áß/Á¾¼ºÀ» ±¸ºÐÇÏÁö ¾Ê°í ±×³É »ç¿ëµÇ´Â ¸ðµç ÀÚ¸ðµéÀÌ Çѵ¥ ¹¿© µé¾î ÀÖ½À´Ï´Ù. * ¼¼¹øÂ°´Â 0xAC00-0xD7A3 ±îÁöÀÇ ÇÑ±Û ¿µ¿ª. ÀÌ ºÎºÐ¿¡´Â Çö´ë ÇÑ±Û ÀÚ¸ð·Î Ç¥Çö °¡´ÉÇÑ ¸ðµç ÇÑ±Û ¹®ÀÚµé(11172ÀÚ=19*21*28))ÀÌ µé¾î ÀÖ½À´Ï´Ù. * °£´ÜÇÑ °è»êÀ» ÅëÇØ Àڸ𸦠ÃßÃâÇÏ´Â °ÍÀÌ °¡´ÉÇÕ´Ï´Ù. * ±× ¿Ü ÇÑÀÚµéÀº ´Ù¸¥ ¿µ¿ª¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.
* *ÀÔ·ÂÇÑ ¹®ÀÚ°¡ ÇѱÛÀÎÁö ÆÇ´ÜÇÑ´Ù.
*(Äڵ尪ÀÌ ÇÑ±Û ¿µ¿ª(0xAC00-0xD7A3)ÀÎÁö ÆÇ´Ü)
* * @param c * @return ÇѱÛÀ̸étrue
, ¾Æ´Ï¸é false
*/
public static boolean isHangulSyllables(char ch) {
return ch >= HANGUL_SYLLABLES_BEGIN && ch <= HANGUL_SYLLABLES_END;
}
/**
* ÀÔ·ÂÇÑ ¹®ÀÚ°¡ ÇÑ±Û È£È¯ ÀÚ¸ðÀÎÁö ÆÇ´ÜÇÑ´Ù.
*(Äڵ尪ÀÌ ÇÑ±Û È£È¯ Àڸ𠿵¿ª(0x1100-0x318E)ÀÎÁö ÆÇ´Ü)
* * @param ch * @return ÇÑ±Û È£È¯ ÀÚ¸ðÀ̸étrue
, ¾Æ´Ï¸é false
*/
public static boolean isHangulCompatibilityJamo(char ch) {
return ch >= HANGUL_COMPATIBILITY_JAMO_BEGIN && ch <= HANGUL_COMPATIBILITY_JAMO_END;
}
/**
* ÀÔ·ÂÇÑ ¹®ÀÚ°¡ ÇÑ±Û È£È¯ ¿µ¿ª Áß Çö´ë ÀÚÀ½ÀÎÁö ÆÇ´ÜÇÑ´Ù.
*(Äڵ尪ÀÌ ÇÑ±Û È£È¯ Àڸ𠿵¿ªÁß Çö´ë ÀÚÀ½(0x3130-0x314E)ÀÎÁö ÆÇ´Ü)
* * @param ch * @return */ public static boolean isHangulCompatibilityJa(char ch) { return ch >= HANGUL_COMPATIBILITY_JA_BEGIN && ch <= HANGUL_COMPATIBILITY_JA_END; } /** *ÀÔ·ÂÇÑ ¹®ÀÚ°¡ ÇÑ±Û È£È¯ ¿µ¿ªÁß Çö´ë ¸ðÀ½ÀÎÁö ÆÇ´ÜÇÑ´Ù.
*(Äڵ尪ÀÌ ÇÑ±Û È£È¯ Àڸ𠿵¿ªÁß Çö´ë ¸ðÀ½(0x314F-0x3163)ÀÎÁö ÆÇ´Ü)
* * @param ch * @return */ public static boolean isHangulCompatibilityMo(char ch) { return ch >= HANGUL_COMPATIBILITY_MO_BEGIN && ch <= HANGUL_COMPATIBILITY_MO_END; } /** *ÀÔ·ÂÇÑ ¹®ÀÚ°¡ ÇÑ±Û ÀÚ¸ðÀÎÁö ÆÇ´ÜÇÑ´Ù.
*(Äڵ尪ÀÌ ÇÑ±Û Àڸ𠿵¿ª(0x3130-0x11F9)ÀÎÁö ÆÇ´Ü)
* * @param ch * @return ÇÑ±Û ÀÚ¸ðÀ̸étrue
, ¾Æ´Ï¸é false
*/
public static boolean isHangulJamo(char ch) {
return ch >= HANGUL_JAMO_BEGIN && ch <= HANGUL_JAMO_END;
}
/**
* ÃʼºÀ» ÃßÃâÇÑ´Ù.
* * @param ch * @return */ public static char getChoseong(char ch) { if (isHangulSyllables(ch) == false) { throw new IllegalArgumentException("ÀԷ°ªÀÌ À߸øµÇ¾ú½À´Ï´Ù. (" + ch + ")"); } int hCode = (ch - HANGUL_SYLLABLES_BEGIN) / (HANGUL_JUNGSEONG_SIZE * HANGUL_JONGSEONG_SIZE); return HANGUL_CHOSEONG[hCode]; } /** *Áß¼ºÀ» ÃßÃâÇÑ´Ù.
* * @param ch * @return */ public static char getJungseong(char ch) { if (isHangulSyllables(ch) == false) { throw new IllegalArgumentException("ÀԷ°ªÀÌ À߸øµÇ¾ú½À´Ï´Ù. (" + ch + ")"); } int hCode = ((ch - HANGUL_SYLLABLES_BEGIN) % (HANGUL_JUNGSEONG_SIZE * HANGUL_JONGSEONG_SIZE)) / HANGUL_JONGSEONG_SIZE; return HANGUL_JUNGSEONG[hCode]; } /** *Á¾¼ºÀ» ÃßÃâÇÑ´Ù.
* * @param ch * @return */ public static char getJongseong(char ch) { if (isHangulSyllables(ch) == false) { throw new IllegalArgumentException("ÀԷ°ªÀÌ À߸øµÇ¾ú½À´Ï´Ù. (" + ch + ")"); } int hCode = ((ch - HANGUL_SYLLABLES_BEGIN) % (HANGUL_JUNGSEONG_SIZE * HANGUL_JONGSEONG_SIZE)) % HANGUL_JONGSEONG_SIZE; return HANGUL_JONGSEONG[hCode]; } /** *ÃÊ/Áß/Á¾¼ºÀ» ÃßÃâÇÑ´Ù. *
* @param ch * @return [Ãʼº, Áß¼º, Á¾¼º] or [Ãʼº, Áß¼º] */ public static char[] getJamo(char ch) { char[] jamo = new char[3]; jamo[0] = getChoseong(ch); jamo[1] = getJungseong(ch); jamo[2] = getJongseong(ch); if (jamo[2] == HANGUL_JONGSEONG[0]) { char[] temp = new char[2]; temp[0] = jamo[0]; temp[1] = jamo[1]; jamo = temp; } return jamo; } /** *Á¾¼ºÀÌ Á¸ÀçÇÏ´ÂÁö ¿©ºÎ¸¦ ÆÇ´ÜÇÑ´Ù.
* * @param ch * @return Á¾¼ºÀÌ Á¸ÀçÇϸétrue
, ¾Æ´Ï¸é false
*/
public static boolean hasJongseong(char ch) {
return getJongseong(ch) != HANGUL_JONGSEONG[0];
}
/**
* Ãʼº, Áß¼ºÀ» °ãÇÕÇÏ¿© ÇѱÛÀÚ·Î ¸¸µç´Ù.
* * @param choseong Ãʼº * @param jungseong Áß¼º * @return */ public static char toHangul(char choseong, char jungseong) { return toHangul(choseong, jungseong, HANGUL_JONGSEONG[0]); } /** *Ãʼº, Áß¼º, Á¾¼ºÀ» °áÇÕÇÏ¿© ÇѱÛÀÚ·Î ¸¸µç´Ù.
* * @param choseong Ãʼº * @param jungseong Áß¼º * @param jongseong Á¾¼º * @return */ public static char toHangul(char choseong, char jungseong, char jongseong) { Integer choseongIndex = HANGUL_CHOSEONG_CODE_TABLE.get(choseong); if (choseongIndex == null) { throw new IllegalArgumentException("ÃʼºÀÌ À߸øµÇ¾ú½À´Ï´Ù. (" + choseong + ")"); } Integer jungseongIndex = HANGUL_JUNGSEONG_CODE_TABLE.get(jungseong); if (jungseongIndex == null) { throw new IllegalArgumentException("Áß¼ºÀÌ À߸øµÇ¾ú½À´Ï´Ù. (" + jungseong + ")"); } if (jongseong == ' ') { jongseong = HANGUL_JONGSEONG[0]; } Integer jongseongIndex = HANGUL_JONGSEONG_CODE_TABLE.get(jongseong); if (jongseongIndex == null) { throw new IllegalArgumentException("Á¾¼ºÀÌ À߸øµÇ¾ú½À´Ï´Ù. (" + jongseong + ")"); } return (char)(HANGUL_SYLLABLES_BEGIN + (choseongIndex * (HANGUL_JUNGSEONG_SIZE * HANGUL_JONGSEONG_SIZE)) + (jungseongIndex * HANGUL_JONGSEONG_SIZE) + jongseongIndex); } /** *±ÛÀÚ¿¡ ¾Ë¸Â´Â Á¶»ç¸¦ ¼±ÅÃÇÑ´Ù.
* ** Hangul.getJosa('ÇÑ', 'Àº', '´Â') = 'Àº' * Hangul.getJosa('Áö', 'ÀÌ', '°¡') = '°¡' ** * @param ch * @param aux1 Á¾¼ºÀÌ ÀÖÀ»¶§ ºÙÀÏ Á¶»ç * @param aux2 Á¾¼ºÀÌ ¾øÀ»¶§ ºÙÀÏ Á¶»ç * @return */ public static char getJosa(char ch, char aux1, char aux2) { return hasJongseong(ch) ? aux1 : aux2; } /** *
±ÛÀÚ¿¡ ¾Ë¸Â´Â Á¶»ç¸¦ ¼±ÅÃÇÑ´Ù.
* ** Hangul.getJosa('ÇÑ', "Àº", "´Â") = "Àº" * Hangul.getJosa('Áö', "ÀÌ", "°¡") = "°¡" ** * @param ch * @param aux1 Á¾¼ºÀÌ ÀÖÀ»¶§ ºÙÀÏ Á¶»ç * @param aux2 Á¾¼ºÀÌ ¾øÀ»¶§ ºÙÀÏ Á¶»ç * @return */ public static String getJosa(char ch, String aux1, String aux2) { return hasJongseong(ch) ? aux1 : aux2; } }