얼마전에 한참 태그검색 관련해서 이것저것 해보(?)다가
뭐랄까... 영어...의 대소문자 구분...을 엮어볼까...라는 생각을 했는데,
-.-... 그러다보니 한글의 경우도 비슷한 경우를 들 수 있겠다...싶어서 일단 찾아봤다.
참고 : _프_비쥬얼베이직 - [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>
...
QKRDPTJ_DLFJGRP_EE_EJFRHDLTDMAUS_K___밖에서_이렇게_ㄷㄷ_떨고있으면_ㅏ___
...
사용 용도는
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 에서 마지막 글자에 뭔가 오류같은 글자가 나왔다... = =;... 어떻게 해결해야할까...
'string' 카테고리의 다른 글
심심풀이] 상하반전문자를 만들어볼까... (0) | 2010.05.12 |
---|---|
filename] html 파일의 파일명/파일확장자 구하기... (0) | 2010.05.08 |
패턴]...을 기준으로 추출하려 할 때... (0) | 2010.05.06 |
주소종류 구별하기...? (0) | 2009.09.04 |
팝업의 서술을 위해... 만들어본 buffering 함수...? (0) | 2009.09.03 |