얼마전에 한참 태그검색 관련해서 이것저것 해보(?)다가
뭐랄까... 영어...의 대소문자 구분...을 엮어볼까...라는 생각을 했는데,

-.-... 그러다보니 한글의 경우도 비슷한 경우를 들 수 있겠다...싶어서 일단 찾아봤다.

참고 : _프_비쥬얼베이직 - [6.0] 한글 합치기&분해함수 - http://blog.daum.net/nnmoney/8914588

시간은 나름 오래 걸렸지만,
검색으로 걸러낼 수 있는 이정도라면 나름 안심...

...


<script>
var
  ChoCode=['ᄀ', 'ᄁ', 'ᄂ', 'ᄃ', 'ᄄ', 'ᄅ', 'ᄆ', 'ᄇ', 'ᄈ', 'ᄉ', 'ᄊ', 'ᄋ', 'ᄌ', 'ᄍ', 'ᄎ', 'ᄏ', 'ᄐ', 'ᄑ', 'ᄒ'],
  ChoKey=['R', 'R', 'S', 'E', 'E', 'F', 'A', 'Q', 'Q', 'T', 'T', 'D', 'W', 'W', 'C', 'Z', 'X', 'V', 'G'],
  JungCode=['ᅡ', 'ᅢ', 'ᅣ', 'ᅤ', 'ᅥ', 'ᅦ', 'ᅧ', 'ᅨ', 'ᅩ', 'ᅪ', 'ᅫ', 'ᅬ', 'ᅭ', 'ᅮ', 'ᅯ', 'ᅰ', 'ᅱ', 'ᅲ', 'ᅳ', 'ᅴ', 'ᅵ'],
  JungKey=['K', 'O', 'I', 'O', 'J', 'P', 'U', 'P', 'H', 'HK', 'HO', 'HL', 'Y', 'N', 'NJ', 'NP', 'NL', 'B', 'M', 'ML', 'L'],
  JongCode=['ᆨ', 'ᆩ', 'ᆪ', 'ᆫ', 'ᆬ', 'ᆭ', 'ᆮ', 'ᆯ', 'ᆰ', 'ᆱ', 'ᆲ', 'ᆳ', 'ᆴ', 'ᆵ', 'ᆶ', 'ᆷ', 'ᆸ', 'ᆹ', 'ᆺ', 'ᆻ', 'ᆼ', 'ᆽ', 'ᆾ', 'ᆿ', 'ᇀ', 'ᇁ', 'ᇂ'],
  JongKey=['R', 'R', 'RT', 'S', 'SW', 'SG', 'E', 'F', 'FR', 'FA', 'FQ', 'FT', 'FX', 'FV', 'FG', 'A', 'Q', 'QT', 'T', 'T', 'D', 'W', 'C', 'Z', 'X', 'V', 'G'],
  keyinCode=['ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ', 'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'],
  keyinKey=['R', 'R', 'RT', 'S', 'SW', 'SH', 'E', 'E', 'F', 'FR', 'FA', 'FQ', 'FT', 'FX', 'FV', 'FG', 'A', 'Q', 'Q', 'QT', 'T', 'T', 'D', 'W', 'W', 'C', 'Z', 'X', 'V', 'G', 'K', 'O', 'K', 'O', 'J', 'P', 'U', 'P', 'H', 'HK', 'HO', 'HL', 'Y', 'N', 'NJ', 'NP', 'NL', 'B', 'M', 'ML', 'L'],
  JungJongNum = 588, //'중성폭21 * 종성폭28

  Cho = ChoCode[0].charCodeAt(0), //'ㄱ
  Jung = JungCode[0].charCodeAt(0), //'ㅏ
  Jong = JongCode[0].charCodeAt(0), //'ㄱ(종성)
  BaseAC00 = '가'.charCodeAt(0), //'베이스 - 가AC00 ~ 힣D7A3 (55203)

  BaseA='A'.charCodeAt(0),
  Basea='a'.charCodeAt(0),
  diffAa=BaseA-Basea,

  BaseEI='A'.charCodeAt(0),
  diffAEI=BaseA-BaseEI,
  Baseei='a'.charCodeAt(0),
  diffAei=BaseA-Baseei,

  Base0='0'.charCodeAt(0),
  BaseZero='0'.charCodeAt(0),
  diffZero0=Base0-BaseZero,

  Basekey='ㄱ'.charCodeAt(0);


function getKeyCode(sourceString) {
  var keyChar, keyCode, i, outkey, choV, jungV, jongV;

  outkey='';
  for (i=0; i<sourceString.length; i++) {
    keyCode=(keyChar=sourceString.charAt(i)).charCodeAt(0);

if ((keyChar>='0')&&(keyChar<='9'))
  outkey+=keyChar;
else if ((keyChar>='A')&&(keyChar<='Z'))
  outkey+=keyChar;
else if ((keyChar>='a')&&(keyChar<='z'))
  outkey+=String.fromCharCode(keyCode+diffAa);
else if ((keyChar>='가')&&(keyChar<='힣')) {
  choV = parseInt((keyCode - BaseAC00) / JungJongNum);
  jungV = parseInt(((keyCode - BaseAC00) % JungJongNum) / 28);
  jongV = parseInt((keyCode - BaseAC00) % 28 - 1);
  outkey+= ChoKey[choV]+JungKey[jungV];
  if (jongV>=0) outkey+=JongKey[jongV];
  }
else if ((keyChar>='A')&&(keyChar<='Z'))
  outkey+=String.fromCharCode(keyCode+diffAEI);
else if ((keyChar>='a')&&(keyChar<='z'))
  outkey+=String.fromCharCode(keyCode+diffAEI);
else if ((keyChar>='0')&&(keyChar<='9'))
  outkey+=String.fromCharCode(keyCode+diffZero0);

else if ((keyChar>='ㄱ')&&(keyChar<='ㅣ'))
  outkey+=keyinKey[keyCode-Basekey];
else outkey+='_';
    }

  return outkey;
  }

function getKeyChar(sourceString) {
  var keyChar, i, outkey, choV, jungV, jongV;

  outkey='';
  for (i=0; i<sourceString.length; i++) {
    keyCode=(keyChar=sourceString.charAt(i)).charCodeAt(0);

if ((keyChar>='0')&&(keyChar<='9'))
  outkey+=keyChar;
else if ((keyChar>='A')&&(keyChar<='Z'))
  outkey+=keyChar;
else if ((keyChar>='a')&&(keyChar<='z'))
  outkey+=String.fromCharCode(keyCode+diffAa);
else if ((keyChar>='가')&&(keyChar<='힣')) {
  choV = parseInt((keyCode - BaseAC00) / JungJongNum);
  jungV = parseInt(((keyCode - BaseAC00) % JungJongNum) / 28);
  jongV = parseInt((keyCode - BaseAC00) % 28 - 1);
  outkey+= ChoCode[choV]+JungCode[jungV];
  if (jongV>=0) outkey+=JongCode[jongV];
  }
else if ((keyChar>='A')&&(keyChar<='Z'))
  outkey+=String.fromCharCode(keyCode+diffAEI);
else if ((keyChar>='a')&&(keyChar<='z'))
  outkey+=String.fromCharCode(keyCode+diffAEI);
else if ((keyChar>='0')&&(keyChar<='9'))
  outkey+=String.fromCharCode(keyCode+diffZero0);

else if ((keyChar>='ㄱ')&&(keyChar<='ㅣ'))
  outkey+=keyinCode[keyCode-Basekey];
else outkey+='_';
    }

  return outkey;
  }

document.write(getKeyCode('밖에서 이렇게 ㄷㄷ 떨고있으면 ㅏ...'));
document.write(getKeyChar('밖에서 이렇게 ㄷㄷ 떨고있으면 ㅏ...'));
</script>


...






...

사용 용도는
getKeyCode(string) : 키보드 입력값을 추출
getKeyChar(string) : 키보드 각 추출값을 표시 (단, 한글 중 글자화된 내용과 글자화되지 않은 내용 구별.)

...

제작할 때...의 감으로 보면

1) 초, 중, 종성이 필요한 경우가 있더라
  그냥 keyChar 에 있는 값으로도 찾는 것은 가능하지만, 초, 중, 종성으로써 요구하는 범위가 틀려서...

1-2) 종성이 없는 경우에는?
  없으면 없다고 말을 하란말이야!...라고 하고싶었는데 ㅎㅎ;... 다행히도 -1 가 표시되어서 그걸 사용할 수 있었다.

1-3) cho, jung, jong 외에 keyin 의 의미는?
  키보드로 입력할 수 있는 범위가 따로 있었다. 글자로 표시된 내용 외의 것을 표현하는 범위라고 할까...
  처음에는 jong 으로 표현하고 싶었는데, 그런 문제는 아니었다.

2) 특수문자는?
  글자로 표현될 것 같은 범위는 글자로 표현했지만, 그 외에는 그냥 _ 로 찍었다.

3) '_' 의 의미는?
  특수문자...대신 공백처럼 쓰려고 적어둔건데,... 나중에 검색용으로 지정할 땐 빼거나, 공백 하나로 남기고 싶다.

4) 검색용으로 쓸 땐?
  음... 검색용 키도 위의 함수를 이용해서 추출하고, 그것으로 검색하게될 듯.

5) 대소문자는?
  BaseA 와 Basea 를 기준으로 추출하고, BaseEI, Baseei 에서 특수문자화된 글자도 추출.
  따로 짚어보고 싶었지만, 그래도... 나름 표시가 있어야할 것 같아서 'A' 형식으로 표시.

... ('10.04.28 22:05 추가)

6) shift + press 를 이용한 입력이나 double press (ㅆ, ㄲ) 를 이용한 종성은?
  이 역시 생각해봐야할 문제다.
  초성의 경우는 shift + press 의 의미를 "중복값"에서 찾을 수 있지만,
  종성의 경우, ㅆ, ㄲ 을 double press 로 표현할 경우도 있겠다...라고 생각했는데, = =;... 입력 안되넹...
  ... 그냥 shift + press 를 키값 중복을 이용해서 처리하면 될 듯.

  단, 키보드로 입력한 후의 검색에 의미...라는 것으로 염두해둬야할 듯. (크게 신경 안써도 될 것 같긴 하지만...)

... ('10.05.06 추가)

7) 지인의 집에서 테스트 해봤는데... 엥?
초중종성을 분해해놨건만 그게 전부 한글자로 붙어있었다...
=.=? 이런 현상도 있었넹...? (Window 7 IE 8)

...

NowMark killofki@.

ps... Chrome 에서 마지막 글자에 뭔가 오류같은 글자가 나왔다... = =;... 어떻게 해결해야할까...


Posted by killofki
,