728x90
반응형
WPF & C# - 초성검색 한글자동완성 ( 한글 / 영어/ 숫자 검색 가능 / 유니코드 매칭 / unicode) |
C# 기초로 한글 검색기(초성 포함) 만들기 [Step by Step]
원문 : https://support.microsoft.com/ko-kr/help/2701840
위의 원문을 중심으로 공부해보았다.
유니코드 매칭 부분
MainWindow.xaml
1234 <StackPanel Margin="10" Width="200"><Button x:Name="btn" Content="유니코드 매칭" Click="btn_Click"/><ListBox x:Name="lbx" Height="300"/></StackPanel>cs
MainWindow.xaml.cs
123456789101112131415161718192021222324 // 초성: ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ (19가지)// 중성: ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ(21가지)// 종성 : 없음, ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ(28가지)// 유니코드= 44032+(초성*588)+(중성*28)+종성;char[] chr = { 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ','ㅋ','ㅌ', 'ㅍ', 'ㅎ' };string[] str = { "가", "까", "나", "다", "따", "라", "마", "바", "빠", "사", "싸", "아", "자", "짜", "차","카","타", "파", "하" };int[] chrint = {44032,44620,45208,45796,46384,46972,47560,48148,48736,49324,49912,50500,51088,51676,52264,52852,53440,54028,54616,55204};// 가 를 기준으로 유니코드와 매칭private void btn_Click(object sender, RoutedEventArgs e){int x = 44032;for (int j = 1; j <= 21; j++) // 중성{for (int k = 1; k <= 28; k++) // 종성{lbx.Items.Add(j.ToString() + " , " + k.ToString());lbx.Items.Add(x.ToString() + " : " + (char)x);x++;}}}cs
textbox 를 통한 검색에 반영 부분
MainWindow.xaml
1234 <StackPanel Margin="10" Width="200"><TextBox x:Name="tbx2" TextWrapping="Wrap" Text="" PreviewKeyDown="tbx2_PreviewKeyDown"/><ListBox x:Name="lbx2"/></StackPanel>cs
MainWindow.xaml.cs
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 private void tbx2_PreviewKeyDown(object sender, KeyEventArgs e){lbx2.Items.Clear();List<string> list = new List<string>();list.AddRange(new List<string> { "가시나무", "소나무", "목련", "백일홍", "청단풍", "홍단풍", "가이즈까향나무", "감나무", "개나리", "금송" });searchWord(list, tbx2.Text);}/// <summary>/// 검색(한글 및 초성, 영어, 숫자)/// </summary>/// <param name="list">입력된 자료</param>/// <param name="word">검색어</param>void searchWord(List<string> list, string word){string x = word;string pattern = "";for (int i = 0; i < x.Length; i++){//초성만 입력되었을때if (x[i] >= 'ㄱ' && x[i] <= 'ㅎ'){for (int j = 0; j < chr.Length; j++){if (x[i] == chr[j]){pattern += string.Format("[-]", str[j], (char)(chrint[j + 1] - 1));}}}//완성된 문자를 입력했을때 검색패턴 쓰기else if (x[i] >= '가'){//받침이 있는지 검사int magic = ((x[i] - '가') % 588);//받침이 없을때.if (magic == 0){pattern += string.Format("[-]", x[i], (char)(x[i] + 27));}//받침이 있을때else{magic = 27 - (magic % 28);pattern += string.Format("[-]", x[i], (char)(x[i] + magic));}}//영어를 입력했을때else if (x[i] >= 'A' && x[i] <= 'z'){pattern += x[i];}//숫자를 입력했을때.else if (x[i] >= '0' && x[i] <= '9'){pattern += x[i];}}var res = list.Where(e => Regex.IsMatch(e.ToString(), pattern));foreach (var c in res){lbx2.Items.Add(c);}lbx2.Items.Add(pattern);}cs
728x90
반응형