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

소개


C#에서 기본적으로 제공하는 AutoComplete(자동 완성)에서는 한글 초성 검색이 안 되는 아쉬움이 있습니다. 현재 인터넷 검색 엔진에서 제공하는 AutoComplete(자동 완성)은 초성 뿐만 아니라 상당한 편의성의 자동 완성 컨트롤을 제공합니다. 이렇게 편한 컨트롤을 사용하는 사람들에겐 C# AutoComplete은 약간의 아쉬움을 남게 하여, 이 부분에 대해 간단한 프로그래밍 방법에 대해 설명을 합니다.

 

방법1: 문자 코드에 대하여


  1. 한글은 초성, 중성, 종성으로 나눠집니다. 
    -초성: ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ (19가지)
    -중성: ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ (21가지)
    -종성 : 없음, ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ (28가지)
  2. 완성된 글자를 만드는 순서는 아래와 같습니다.

    초성)ㄱ + 중성) ㅏ + 종성) 28개 ->

    초성)ㄱ + 중성) 중성 21개 + 종성) 28개 ->

    초성)19개 + 중성) 중성 21개 + 종성) 28개

    e.g) 가 -> 각 -> 갂 -> 갃….깨 -> 객 -> 갞 ….깋….힣
  3. '가’의 문자코드는 44032로 시작을 하며 587을 더하면 ‘ㄱ’의 마지막 문자인 ‘깋’이 나옵니다(588을 더하면 다음 초성이 나옵니다).
  4. 아래는 간단한 코드 샘플입니다
     
    class Program
        {
            static void Main(string[] args)
            {
                int x = 44032;
     
                for (int i = 1; i <= 21; i++)
                {                
                    for (int j = 1; j <= 28; j++)
                    {
                        Console.Write("{0} : {1}", x, (char)x);
                        x++;
                    }
                    Console.WriteLine();                                            
                }
            }
        } 

    출력 결과 


방법2: Regex 검색 패턴 만들기


  1.  '방법 1'에서 기초를 다뤘으니 이제는 약간 더 응용을 해서 'ㄱ수'를 입력했을때와 '가수'를 입력했을 때에 대하여 생각을 해야 합니다.

    - 초성만 입력했을 경우 chr 변수의 인덱스를 찾아 str 변수의 인덱스로 교체

    e.g) 'ㄱ'을 입력했을 때에는 가로 변환 후 출력 

     '가'를 입력했을 때에는 가를 출력
    char[] chr = { 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ',
                               'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ','ㅋ','ㅌ', 'ㅍ', 'ㅎ' };
              string[] str = { "가", "까", "나", "다", "따", "라", "마", "바", "빠", "사", "싸",
                               "아", "자", "짜", "차","카","타", "파", "하" };
    string x = Console.ReadLine();
    string temp = "";
                for (int i = 0; i < x.Length; i++)
                {
                    if (x[i] < (char)43032)
                    {
                        for (int j = 0; j < chr.Length; j++)
                        {
                            if (x[i] == chr[j])
                            {
                                temp += str[j];
                            }
                        }
                    }
                    else
                    {
                        temp += x[i];
                    }
                }
     
                Console.WriteLine(temp); 

    결과 화면 :입력을 하면 중성을 붙혀줍니다.


  2. 이제 Regex검색을 위한 패턴을 만들어야 합니다.

    - 'ㄱ'을 입력하면 ㄱ-깋까지 검색을 해야 합니다.

    - '가'를 입력하면 초성이 아니기 때문에 그대로 '가'를 temp에 넣습니다.
    int[] chrint = {44032,44620,45208,45796,46384,46972,47560,48148,48736,49324,49912,
                                   50500,51088,51676,52264,52852,53440,54028,54616,55204};
     
    string x = Console.ReadLine();
                string temp = "";
                for (int i = 0; i < x.Length; i++)
                {
                    if (x[i] < '가') 
                    {
                        for (int j = 0; j < chr.Length; j++)
                        {
                            if (x[i] == chr[j])
                            {
                                temp += "[" + x[j] + "-" + (char)(chrint[j + 1] - 1) + "]";
                            }
                        }
                    }
                    else
                    {
                        temp += x[i];
                    }
                } 
  3. 이제 간단한 linq와 regex문을 이용해서 검색을 한 후 출력을 합니다.
     
    var query = list.Where(e => Regex.IsMatch(e.ToString(),temp));
     
                foreach (var c in query)
                {
                    Console.WriteLine(c);
                }     


방법3: 자동 완성 실행해 보기


  1. 전체 소스
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text.RegularExpressions;
     
    namespace searchHan
    {
        class Program
        {
     
            static void Main(string[] args)
            {
                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};
     
     
                List<string> list = new List<string>();
                list.AddRange(new List<string> { "가시나무", "소나무", "목련", "백일홍", "청단풍", "홍단풍","가이즈까향나무","감나무","개나리","금송"});
                string x = Console.ReadLine();
                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 += "[" + str[j] + "-" + (char)(chrint[j + 1] - 1) + "]";
                                //pattern += string.Format("[{0}-{1}]", str[j], (char)(chrint[j + 1] - 1));
                            }
                        }
                    }
                    else
                    {
                        pattern += x[i];
                    }               
                }
                var res = list.Where(e => Regex.IsMatch(e.ToString(),pattern));
     
                foreach (var c in res)
                {
                    Console.WriteLine(c);
                }             
    Console.WriteLine(pattern);
            }
        }
    } 
    출력 화면
  2. C# 기초 문법에 약간의 Linq + Regex만으로 초성 검색에 대하여 간단히 다뤄봤습니다. 약간의 조건문만 더 추가하시면 좋을 것이라 생각됩니다. 약간의 코드를 더해보았습니다. 
    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("[{0}-{1}]", str[j], (char)(chrint[j + 1] - 1));
                            }
                        }
                    }
                    //완성된 문자를 입력했을때 검색패턴 쓰기
                    else if(x[i] >= '가')                
                    {
                        //받침이 있는지 검사
                        int magic = ((x[i] - '가') % 588);
     
                        //받침이 없을때.
                        if (magic == 0) 
                        {
                            pattern += string.Format("[{0}-{1}]", x[i], (char)(x[i] + 27));
                        }
                        
                        //받침이 있을때
                        else
                        {
                            magic = 27 - (magic % 28);
                            pattern += string.Format("[{0}-{1}]", 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]; 
                    }
                }      
  3. [출처] https://support.microsoft.com/ko-kr/help/2701840

 

경축! 아무것도 안하여 에스천사게임즈가 새로운 모습으로 재오픈 하였습니다.
어린이용이며, 설치가 필요없는 브라우저 게임입니다.
https://s1004games.com

 

본 웹사이트는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.
번호 제목 글쓴이 날짜 조회 수
100 Visual Studio 2010 Ultimate 정식버전 전환, 정식버전, 정식버전 사용 졸리운_곰 2020.07.26 44
99 Selenium C# Webdriver Tutorial: NUnit Example file 졸리운_곰 2020.01.03 68
98 VB로 웹페이지 읽어오기 - 웹 스크랩 file 졸리운_곰 2020.01.03 183
97 [C# 인공지능] 유전 알고리즘 : 유전 알고리즘으로 컴퓨터 자동 프로그래밍 AI-Programmer file 졸리운_곰 2019.12.28 231
» C# 기초로 한글 검색기(초성 포함) 만들기 [Step by Step] file 졸리운_곰 2019.12.11 1414
95 (C#.NET 한글 프로그램 제작) 한글 조립 및 분해 하기 (유니코드 Unicode) file 졸리운_곰 2019.12.11 272
94 C#에서 유니코드를 이용한 한글 자모 분리와 결합 졸리운_곰 2019.12.11 1213
93 [C#] GUID 생성. file 졸리운_곰 2019.02.27 166
92 MetaWeblogAPI VisualBasic .NET 코드 샘플 졸리운_곰 2019.02.08 272
91 MetaWeblogAPI C# 코드 샘플 졸리운_곰 2019.02.08 252
90 A Look into the Future - Source Code Generation by the Bots file 졸리운_곰 2019.01.23 164
89 Machine Learning with ML.Net and C#/VB.Net file 졸리운_곰 2018.12.14 463
88 Scientific graphics in C# - [part 2] file 졸리운_곰 2018.12.06 3911
87 Scientific graphics in C# [part 1] file 졸리운_곰 2018.12.06 144
86 Window 7 Enterprise 64bit에 vb6 (visual studio 6.0 ent버젼) 설치 file 졸리운_곰 2018.12.04 363
85 Application Trial Maker file 졸리운_곰 2018.11.22 191
84 C# 프로젝트에서 C++ 코드 사용 : Use C++ codes in a C# project — unmanaged C++ solution 졸리운_곰 2018.10.30 199
83 C# 으로 구현하는 간단한 뉴럴네트워크 : Implementing Simple Neural Network in C# file 졸리운_곰 2018.10.30 326
82 Machine Learning with ML.Net and C#/VB.Net file 졸리운_곰 2018.08.16 827
81 오픈소스 닷넷 라이브러리 Awesome .NET! file 졸리운_곰 2018.07.08 2190
대표 김성준 주소 : 경기 용인 분당수지 U타워 등록번호 : 142-07-27414
통신판매업 신고 : 제2012-용인수지-0185호 출판업 신고 : 수지구청 제 123호 개인정보보호최고책임자 : 김성준 sjkim70@stechstar.com
대표전화 : 010-4589-2193 [fax] 02-6280-1294 COPYRIGHT(C) stechstar.com ALL RIGHTS RESERVED