본문 바로가기

Programing (프로그래밍)/WPF & C# (C Sharp)

WPF & C# - 초성검색 한글자동완성 ( 한글 / 영어/ 숫자 검색 가능 / 유니코드 매칭 / unicode)

728x90
반응형
 WPF & C# - 초성검색 한글자동완성 ( 한글 / 영어/ 숫자 검색 가능 / 유니코드 매칭 / unicode)

 

C# 기초로 한글 검색기(초성 포함) 만들기 [Step by Step]

원문 : https://support.microsoft.com/ko-kr/help/2701840

위의 원문을 중심으로 공부해보았다.

 

searchWord.zip
0.32MB

 

 

유니코드 매칭 부분

 

 

MainWindow.xaml

 

 
1
2
3
4
<StackPanel Margin="10" Width="200">
    <Button x:Name="btn" Content="유니코드 매칭" Click="btn_Click"/>
    <ListBox x:Name="lbx" Height="300"/>
</StackPanel>
cs
 

 

 

 

 

MainWindow.xaml.cs

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 초성: ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ (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

 

 
1
2
3
4
<StackPanel Margin="10" Width="200">
    <TextBox x:Name="tbx2" TextWrapping="Wrap" Text="" PreviewKeyDown="tbx2_PreviewKeyDown"/>
    <ListBox x:Name="lbx2"/>
</StackPanel>
cs
 

 

 

MainWindow.xaml.cs

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
반응형