[팁] UTF-16 한글 자소 분리, 결합

오, 우연히 발견한 코드를 약간 고쳐봤습니다.

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

| 출력

닭
가
(ㄷ, ㅏ, ㄺ)
(ㄱ, ㅏ,  )

| 출처

13개의 좋아요

char라는 제한이 없다면 string으로 기본 정규화 메서드를 사용하셔도 좋겠습니다. ^^

.NET Framework: 326. 유니코드와 한글 - 유니코드와 닷넷을 이용한 한글 처리 (sysnet.pe.kr)

7개의 좋아요

저만의 생각일지는 모르나 서양에서 만든 문자정보체계가 다른 문화권에 비해 비교적 심플하게 구현 되는것을 볼때마다 참으로 경이롭습니다.
[세종대왕만세] :+1: :+1:

4개의 좋아요

93년에 회사에서 터보c++ 2.0으로 만들던게 생각나네요.
전광판 표시용 데이터를 생성하는 도스용 프로그램을 만드는데.
폰트부터 자소 입력까지 모조리 구현 해야만 했었죠.
심지어 그떄는 폰트 데이터를 어디서 구매할수도 없어서 그래픽카드에
내장된 서체를 화면에 뿌리고 캡쳐해서 사용을…
참고로 그때 그래픽 카드들은 폰트가 내장되어 있었습니다.

여하튼 나름 잘 동작하고 벡스페이스로 자소별 삭제도 지원하고 해서 뿌듯 했었는데 말입니다.
본문에 있는 기능처럼 커서 위치의 한글을 인식해서 자소 분리해서 백스페이스 누르면 받침부터 삭제하게 만들었었죠.

여하튼 재미는 그때가 더 있었지 않나 싶습니다.

오해할까봐 적습니다.
공고출신이라 93년에 입사해서 1년 좀 넘게 일하다 군대갔습니다.

6개의 좋아요

출처에 코드를 보니 2006년 제가 블로그에 썼던 코드에 변수명에 초성, 중성, 종성만 한글이군요.ㅋㅋㅋ
제 블로그와 똑같아서 깜놀.ㅋㅋㅋ
https://blog.naver.com/inobae/90007564511

5개의 좋아요

아 원저작자이시군요 ^^; 반갑습니다.

3개의 좋아요

자연어처리와 ML쪽 일을 .net으로 구현하는 일을 2001년 대학원 다니기 시작할때부터 지금까지 하고 있네요. ㅎㅎ
원저작자라기보다는 반가워서요.ㅋㅋ

2개의 좋아요