コード例 #1
0
        public static void InitHanCharDic()
        {
            for (int i = 0; i < CHOSUNG_ARR.Length; i++)
            {
                char    ch      = CHOSUNG_ARR[i];
                HanChar hanChar = new HanChar();
                hanChar.ch           = ch;
                hanChar.isChosung    = true;
                hanChar.chosungIndex = i;
                HanCharDic.Add(ch, hanChar);
            }

            for (int i = 0; i < JUNGSUNG_ARR.Length; i++)
            {
                char    ch      = JUNGSUNG_ARR[i];
                HanChar hanChar = new HanChar();
                hanChar.ch            = ch;
                hanChar.isJungsung    = true;
                hanChar.jungsungIndex = i;
                HanCharDic.Add(ch, hanChar);
            }

            for (int i = 1; i < JONGSUNG_ARR.Length; i++)
            {
                char    ch      = JONGSUNG_ARR[i];
                HanChar hanChar = HanCharDic.ContainsKey(ch) ? HanCharDic[ch] : new HanChar();
                hanChar.ch            = ch;
                hanChar.isJongsung    = true;
                hanChar.jongsungIndex = i;
                if (!HanCharDic.ContainsKey(ch))
                {
                    HanCharDic.Add(ch, hanChar);
                }
            }

            for (int i = 0; i < CHOSUNG_ARR.Length; i++)
            {
                char    ch      = (char)(0x1100 + i);
                HanChar hanChar = new HanChar();
                hanChar.ch           = ch;
                hanChar.isChosung    = true;
                hanChar.chosungIndex = i;
                HanCharDic.Add(ch, hanChar);
            }

            for (int i = 0; i < JUNGSUNG_ARR.Length; i++)
            {
                char    ch      = (char)(0x1161 + i);
                HanChar hanChar = new HanChar();
                hanChar.ch            = ch;
                hanChar.isJungsung    = true;
                hanChar.jungsungIndex = i;
                HanCharDic.Add(ch, hanChar);
            }

            for (int i = 1; i < JONGSUNG_ARR.Length; i++)
            {
                char    ch      = (char)(0x11A8 + i - 1);
                HanChar hanChar = new HanChar();
                hanChar.ch            = ch;
                hanChar.isJongsung    = true;
                hanChar.jongsungIndex = i;
                HanCharDic.Add(ch, hanChar);
            }
        }
コード例 #2
0
        public static String MergeHangul(String value)
        {
            ParseStatus status = ParseStatus.NORMAL;

            char[]        chars      = value.ToCharArray();
            HanChar[]     buffer     = new HanChar[3];
            StringBuilder result     = new StringBuilder();
            HanChar       notHanChar = new HanChar();

            foreach (char ch in chars)
            {
                HanChar hanChar = HanCharDic.ContainsKey(ch) ? HanCharDic[ch] : notHanChar;
                bool    restart = false;

                do
                {
                    restart = false;

                    switch (status)
                    {
                    case ParseStatus.NORMAL:
                        if (hanChar.isChosung)
                        {
                            buffer[0] = hanChar;
                            status    = ParseStatus.CHO_FOUND;
                        }
                        else
                        {
                            result.Append(ch);
                        }
                        break;

                    case ParseStatus.CHO_FOUND:
                        if (hanChar.isJungsung)
                        {
                            buffer[1] = hanChar;
                            status    = ParseStatus.JUNG_FOUND;
                        }
                        else
                        {
                            result.Append(MergeChar(buffer));
                            status  = ParseStatus.NORMAL;
                            restart = true;
                        }
                        break;

                    case ParseStatus.JUNG_FOUND:
                        if (!hanChar.isChosung && hanChar.isJongsung)
                        {
                            buffer[2] = hanChar;
                            result.Append(MergeChar(buffer));
                            status = ParseStatus.NORMAL;
                        }
                        else if (hanChar.isChosung && hanChar.isJongsung)
                        {
                            buffer[2] = hanChar;
                            status    = ParseStatus.JONG_CHO_FOUND;
                        }
                        else
                        {
                            result.Append(MergeChar(buffer));
                            status  = ParseStatus.NORMAL;
                            restart = true;
                        }
                        break;

                    case ParseStatus.JONG_CHO_FOUND:
                        if (hanChar.isJungsung)
                        {
                            HanChar next_chosung = buffer[2];
                            buffer[2] = null;
                            result.Append(MergeChar(buffer));
                            buffer[0] = next_chosung;
                            buffer[1] = hanChar;
                            status    = ParseStatus.JUNG_FOUND;
                        }
                        else
                        {
                            result.Append(MergeChar(buffer));
                            status  = ParseStatus.NORMAL;
                            restart = true;
                        }
                        break;

                    default:
                        break;
                    }
                } while (restart);
            }

            if (buffer[0] != null)
            {
                result.Append(MergeChar(buffer));
            }

            return(result.ToString());
        }