본문 바로가기

[IT/Programming]/Algorithm/Database

한글 초성검색 in Javascript

반응형
# 한글 초성검색 in Javascript 한글의 위대함을 한껏 활용하기 위해 초성검색을 구현해 봅시다. 문서 오른쪽 위의 Fuzzy search 버튼을 누르시면, 초성검색 (엄밀히는 fuzzy search 이지만) 구현이 어떻게 되어 있는지 아실 수 있습니다. ## TOC ## 한글 Encoding in Javascript 자바스크립트의 문자열은 내부적으로 16비트 유니코드로 처리 . 유니코드에서 한글은 코드값 OxAC00부터 시작하며, 초성 19 / 중성 21 / 종성 28 개의 조합 순으로 코드가 배열. 유니코드에 대한 공식 설명은 에서... 초성, 중성, 종성의 자모 순서는 에서... (Hangul Syllables 부분에 한글 음절에 대한 유니코드표)
  • Hangul Array
  • 초성 "ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"
  • 중성 "ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"
  • 종성 "", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"
한글 Unicode
## 초성, 중성, 종성 분리하기 초성에 8 bit, 중성에 8 bit, 종성에 8 bit 형태로 encoding 이 되어 있으면 굳이 이런 작업이 필요 없겄지만;;; 쌍 기역 "ㄲ" 같은 것들도 있어서(?) 이런 24 bit encoding 이 더 효율이 좋은거 같진 않군요. 아무튼 16 bit unicode 로 이루어진 한글 string data 를 잘 분석해서 초성, 중성, 종성으로 분리해내 봅시다. (뭐 활용하고자 하는 방법에 따라 더 분리해내는게 필요할수도 있긴 하겠네요.) 유니코드에서 특정 글자의 코드 값은 다음과 같은 식으로 생각해 볼 수 있습니다. ( \text{초성} \times 21 \times 28 ) + ( \text{중성} \times 28 ) + \text{종성} \\ = \big( ( \text{초성} \times 21 ) + \text{중성} \big) \times 28 + \text{종성} 정확한 한글 유니코드 값은 \text{한글 유니코드 값} = \text{0xAC00} + \big( ( \text{초성} \times 21 ) + \text{중성} \big) \times 28 + \text{종성} 라고 하는군요 . 정리 해주셔서 감사;;; 이 블로그 글쓴이가 정리 안해주셨으면 이거 알아내는데 엄청 고생했을듯 =ㅂ=;;; 위 식에서 초성 / 중성 / 종성 은 첫 글자를 0 으로 하는 해당 글자의 상에서의 위치. 이런 정보를 바탕으로 다음과 같은 javascript code 를 통해 초성 / 중성 / 종성 을 분리해 낼 수 있는듯. ```[.linenums.lang-js] let rCho = ["ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]; let rJung = ["ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ"]; let rJong = ["", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"]; let cho, jung, jong; let sTest="탱"; let nTmp=sTest.charCodeAt(0) - 0xAC00; jong=nTmp % 28; // 종성 jung=( (nTmp-jong)/28 ) % 21; // 중성 cho=( ( (nTmp-jong)/28 ) - jung ) / 21; // 종성 console.log( "초성:"+rCho[cho]+"\n" +"중성:"+rJung[jung]+"\n" +"종성:"+rJong[jong] ); ```/ ## Test it yourself ```[#hangul-split-result.linenums] ```/ ### Code





## 초성검색

구현된 초성검색은 kipid's blog - Lists 에서 확인하실 수 있습니다. Fuzzy search 버튼 눌러 보세요. 여기에 코드 정리는 나중에 할 예정. (딱히 기약은 없음.) 초성검색과 비슷한 Fuzzy search 글 kipid's blog - Auto Completion, and Fuzzy Search 참고해 보셔도 좋습니다.



## RRA

  1. dream.ahboom.net - 한글 유니코드 자소 분리방법, 2010-02-25
  2. www.unicode.org - Hangul Jamo.pdf and Hangul Compatibility Jamo.pdf and Hangul Syllables.pdf
반응형