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); } }
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()); }