C#에서 유니코드를 이용한 한글 자모 분리와 결합

반응형

 

완성형 한글의 Unicode 범위는 AC00에서부터 D7AF(정확히는 D79F) 범위에 걸쳐 매핑 되어 있다.  한글 자모의 경우 Unicode 범위는 1100에서부터 11FF 범위에 걸쳐 있다.

   유니코드의 자모값의 코드표
    http://www.unicode.org/charts/PDF/U1100.pdf
   한글 완성형 코드표
    http://www.unicode.org/charts/PDF/UAC00.pdf


# 한글 처리를 위한 기초 함수

 아래 예제는 완성형 유니코드를 이용하여 자음과 모음을 분리, 결합하는 함수이다.
 유니코드 표를 보면 한글이 사전순으로 정리되어 있다.
 그래서 초성 자음과 종성 자음의 거리 계산하여 각 자음과 모음을 조합할 수 있다.

 

Console.WriteLine(한글도우미.자소결합('ㄷ', 'ㅏ', 'ㄺ'));

Console.WriteLine(한글도우미.자소결합('ㄱ', 'ㅏ', ' '));

Console.WriteLine(한글도우미.자소분리('닭'));
Console.WriteLine(한글도우미.자소분리('가'));




static class 한글도우미
{
    private const string _초성 = "ㄱㄲㄴㄷㄸㄹㅁㅂㅃㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎ";
    private const string _중성 = "ㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟㅠㅡㅢㅣ";
    private const string _종성 = " ㄱㄲㄳㄴㄵㄶㄷㄹㄺㄻㄼㄽㄾㄿㅀㅁㅂㅄㅅㅆㅇㅈㅊㅋㅌㅍㅎ";
    private const char _한글코드시작 = (char)0xAC00;
    private const char _한글코드끝 = (char)0xD79F;

    public static char 자소결합(char 초성, char 중성, char 종성)
    {
        var ci1 = _초성.IndexOf(초성);
        var ci2 = _중성.IndexOf(중성);
        var ci3 = _종성.IndexOf(종성);

        if (ci1 is -1 || ci2 is -1 || ci3 is -1)
            throw new InvalidOperationException();

        var result = _한글코드시작 + (ci1 * 21 + ci2) * 28 + ci3;
        return (char)result;
    }

    public static (char 초성, char 중성, char 종성) 자소분리(char 한글자)
    {
        if (한글자 is < _한글코드시작 or > _한글코드끝)
            return (' ', ' ', ' ');

        int 코드 = 한글자 - _한글코드시작;

        var ci1 = 코드 / (21 * 28);
        코드 = 코드 % (21 * 28);
        var ci2 = 코드 / 28;
        코드 = 코드 % 28;
        var ci3 = 코드;

        return (_초성[ci1], _중성[ci2], _종성[ci3]);
    }
}

 

 

 

| 출력

닭
가
(ㄷ, ㅏ, ㄺ)
(ㄱ, ㅏ,  )
반응형