자음검색(초성검색)을 구현하려하는데 자바스크립트로 구현하려니 쉽지않다.


    한글 초성검색 in Javascript

    구글링해보면 이 글이 눈에 띄는데 굉장히 이론적이다. 


    하지만 내가 원하는 작업은 홍길동 -> ㅎㄱㄷ인데 응용력이 부족한지 구현하려니 자꾸 복잡해진다.



    구글링을 더 해보니 Hangul.js라는 라이브러리가 이미 있다!


    https://github.com/e-/Hangul.js


    npm모듈도 있어서 node.js에서 사용하기도 쉽다.



    Hangul.js를 이용해 초성만 모아 반환하는 예제는 다음과 같다


    var name = "홍길동";


    var disassemble = Hangul.disassemble(name,true);//2번째 인자로 true를 전달하면 글자마다 독립된 배열을 만들어준다

    // disassemble = [[ㅎ,ㅗ,ㅇ],[ㄱ,ㅣ,ㄹ],[ㄷ,ㅗ,ㅇ]]


    var cho="";

    for (var i=0,l=disassemble.length;i<l;i++){

      cho+=disassemble[i][0];

    }

    //disassemble의 배열의 첫값을 cho에 첨가한다

    //cho = "ㅎㄱㄷ"




    한가지 아쉬운점이 있다면 한/영간 변환기능도 있었다면 좋을 것 같다.

    예를 들면 홍길동 -> ghdrlfehd 또는 grd


    이렇게하면 홍길동을 검색할때 ㅎㄱㄷ, grd, ghdrlfehd으로 모두 검색할 수 있기 때문이다.

    Posted by 뭐하라

    문제가 있나요?(?)

    내용상 오류가 있음 업데이트 필요 화면이 깨짐 기타 수정이 필요함
    • wildman
      2019.10.28 20:07

      님이 아쉽게 느끼는 점은 직접 개발 하면 되는 부분인듯.
      ㅎㄱㄷ <--> gre 이렇게 서로 맵핑하면 될듯
      ㄱ:r~ ㅎ:g 이렇게 13개만 매핑 하면 끝아닌가요?
      함수 소스도 참조해보시고 출처: https://goni9071.tistory.com/164 [고니의꿈]
      허접한 저의 소스도 참조요
      for(i=j;i<='힣'.charCodeAt(0);i++){
      if( (i-ja_base-12593) / 588 == parseInt((i-ja_base-12593) / 588) ) {
      ja_base = i - 12593;//31439
      mo_base = i - 12623;//31409
      }
      cho = String.fromCharCode( 12593 + parseInt((i - 31439 - 12593) / 588) );
      jung = String.fromCharCode( 12623 + parseInt((i - mo_base - 12623) / 28) );
      jong = String.fromCharCode( 12593 + (i-ja_base-12593)%28-1 );

      if(cho >= "ㄳ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄵ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄶ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄺ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄻ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄼ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄽ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄾ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㄿ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㅀ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(cho >= "ㅄ") cho = String.fromCharCode(cho.charCodeAt(0)+1);
      if(jong < "ㄱ") jong = "";
      if(jong >= "ㄸ") jong = String.fromCharCode(jong.charCodeAt(0)+1);
      if(jong >= "ㅃ") jong = String.fromCharCode(jong.charCodeAt(0)+1);
      if(jong >= "ㅉ") jong = String.fromCharCode(jong.charCodeAt(0)+1);

      str += ++l + " " + String.fromCharCode(i)+" "+i + " ";
      str += cho +" ";//초성
      str += jung +" ";//중성
      str += jong +" ";//종성
      str += "<br>";
      }
      str += "<br>";
      document.write(str);