한글을 초성, 중성, 종성으로 분리하기
한글을 초성, 중성, 종성으로 분리하는 기본 원리 소개
한글로 된 텍스트를 많이 다루는 경우, 종종 초성, 중성, 종성을 분리해야 하는 경우가 있습니다. (요즘은 잘 모르는 사람이 많은) 초성 검색이나 한글 단어에 대한 자동 완성 같은 것을 구현하려면 필요한 부분이기도 합니다.
오늘은 간단하게 자바스크립트에서 한글을 초성, 종성, 종성으로 분리하는 방법을 소개하겠습니다. 유니코드 한글은 초, 중, 종성을 조합하는 순서에 따라 각각의 낱자가 배치되어 있습니다. 따라서 글자에 쓰인 각 자모의 인덱스를 알고 있다면 이를 조합한 문자의 코드를 알아낼 수 있습니다. 이 때 사용된 수식을 이용하면 반대로 문자의 코드로부터 각 자모의 인덱스를 얻을 수 있습니다.
한글의 코드 값에 관한 힌트
음소 분리를 위해 알아둘 필요가 있는 몇 가지 사실이 있습니다.
- 유니코드 한글은
0xAC00
부터 시작한다. - 초성 19 개, 중성 28개, 종성 28개로 이루어지고, 이를 조합한 순서대로 문자가 배치된다. (종성은 없는 값을 포함해서 28개임)
따라서 초성, 중성, 종성 각각의 순번을 a, b, c 라고 한다면 이를 조합한 한글 문자의 코드 값은, CHAR = 0xAC00 + (c + 28 * (b + ( 21 * a)))
로 결정됩니다.
이 식으로부터 역산하여 초성, 중성, 종성의 인덱스를 역산하면 다음과 같습니다.
- 초성인덱스 =
((X - 0xAC00) / 28) / 21
- 중성인덱스 =
((X - 0xAC00) / 28) % 21
- 종성인덱스 =
(X - 0xAC00) % 28
이 인덱스를 다시 유니코드 표에서 각 자모음소의 첫 값에 더하면 음소 문자로 분리할 수 있습니다.
- 초성 = 초성인덱스 +
0x1100
- 중성 = 중성인덱서 +
0x1161
- 종성 = 종성인덱스 +
0x11A7
(* 종성 'ㄱ'은0x11A8
이지만, 받침이 없는 경우가 있음)
이 과정을 코드로 표현하면 다음과 같습니다.
그런데 이렇게 구한 초성, 중성, 종성 문자 코드들은 우리가 흔히 말하는 'ㄱ', 'ㅏ'와 같은 낱자가 아니라, 글자를 구성하는 자모에 해당합니다. 따라서 시스템에 따라서는 'ㄴ', 'ㅎ'을 나란히 출력하면 'ㄶ'으로 합쳐지는 경우가 생깁니다.
이런 경우를 방지하기 위해서는 초성자모를 낱자 문자로 변환해야합니다. 이 규칙은 로직으로 만들기가 까다롭기 때문에, 유니코드 문자표를 사용해서 변환 사전을 만들어야 합니다. 이 부분은 다음 기회에 다시 한 번 다뤄보도록 하겠습니다.
안녕!