본문 바로가기

ActionScript/Tip

한글을 분리 1편

출처 카페 > 플래시(Flash)로 생계를.. | 테너스
원문 http://cafe.naver.com/flashdev/15935

안녕하십니꽈! 저번에 타이핑 효과를 보여주는 요상한 물건을 만들었던 테너스입니다.

수수께기를 냈으니 이제 답이 나올 때가 된 듯하여 강좌를 시작하게 되었음다.

틀린 부분이 있다면 과감히 지적하여 악플을 달아주시기 바라옵니다. 그럼 시작하겠습니다.

P.S. 존칭은 생략합니다.


한글은 유니코드로 44032번부터라고 한다.

한글은 초성, 중성, 종성으로 이루어져있으며
초성은 19개 : 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'
중성은 21개 : 'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'
종성은 28개 : ' ','ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'
가 있다. -종성의 0번째는 공백이다.-

그래서 한글 한 글자를 초성, 중성, 종성으로 분리할 때 다음 공식을 이용한다.
==========================================================================

str = "한글";
tmp = str.charCodeAt(0) - 44032;
종성 = tmp % 28;
tmp = Math.floor(tmp/28);
중성 = tmp%21;
tmp = Math.floor(tmp/21);
초성 = tmp;

==(주석)==================================================================
1)str.charCodeAt(0) : str의 첫번째 글자의 유니코드를 반환하는 함수
2)Math.floor(num) : num의 내림값을 반환하는 함수
==========================================================================

"한"이라는 글자를 초성, 종성, 중성으로 분리하면
변수 '종성'에는 4,
변수 '중성'에는 0,
변수 '초성'에는 18 이 들어간다.

초성 "ㅎ"의 번호는 18,
중성 "ㅏ"의 번호는 0,
종성 "ㄴ"의 번호는 4 라는 뜻이다.

여기서 주의할 점은 초성과 종성의 배당된 번호가 다르다는 점이다.
"ㄴ"을 보면 초성에서는 2번이지만 종성에서는 4번이다. 겹받침때문이라는 것을 알 수 있다.

코드에 해당하는 자음 또는 모음을 보고 싶다면 다음과 같이 배열에 넣어두고
인덱스로 참조하는 것이 편하다. -ㅅ-;;
==========================================================================
var c_top:Array = new Array('ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ');
var c_mid:Array = new Array('ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ', 'ㅕ', 'ㅖ', 'ㅗ', 'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ');
var c_btm:Array = new Array(' ','ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ');
trace(c_top[초성]);
trace(c_mid[중성]);
trace(c_btm[종성]);
==========================================================================

그러면 이번에는 겹받침도 쪼개보자. 이거는 정말 공식도 대책도 없다.
switch문으로 돌려야한다. 중성 코드가 겹받침이라면 분석해서 초성코드 두 개로 반환하는 것인데.
그냥 다음 스위치문을 참고하도록 하자.
==========================================================================
var 분리코드 = new Array();

switch(종성) //종성을 분석해서 넣습니다.
{
 case 1:  //"ㄱ"
  분리코드.push(0);
 break;
 case 2:  //"ㄲ"
  분리코드.push(1);
 break;
 case 3:  //"ㄳ"
  분리코드.push(0);
  분리코드.push(9);
 break;
 case 4:  //"ㄴ"
  분리코드.push(2);
 break;
 case 5:  //"ㄵ"
  분리코드.push(2);
  분리코드.push(12);
 break;
 case 6:  //"ㄶ"
  분리코드.push(2);
  분리코드.push(18);
 break;
 case 7:  //"ㄷ"
  분리코드.push(3);
 break;
 case 8:  //"ㄹ"
  분리코드.push(5);
 break;
 case 9:  //"ㄺ"
  분리코드.push(5);
  분리코드.push(0);
 break;
 case 10: //"ㄻ"
  분리코드.push(5);
  분리코드.push(6);
 break;
 case 11: //"ㄼ"
  분리코드.push(5);
  분리코드.push(7);
 break;
 case 12: //"ㄽ"
  분리코드.push(5);
  분리코드.push(9);
 break;
 case 13: //"ㄾ"
  분리코드.push(5);
  분리코드.push(16);
 break;
 case 14: //"ㄿ"
  분리코드.push(5);
  분리코드.push(17);
 break;
 case 15: //"ㅀ"
  분리코드.push(5);
  분리코드.push(18);
 break;
 case 16: //"ㅁ"
  분리코드.push(6);
 break;
 case 17: //"ㅂ"
  분리코드.push(7);
 break;
 case 18: //"ㅄ"
  분리코드.push(7);
  분리코드.push(9);
 break;
 case 19: //"ㅅ"
  분리코드.push(9);
 break;
 case 20: //"ㅆ"
  분리코드.push(10);
 break;
 case 21: //"ㅇ"
  분리코드.push(11);
 break;
 case 22: //"ㅈ"
  분리코드.push(12);
 break;
 case 23: //"ㅊ"
  분리코드.push(14);
 break;
 case 24: //"ㅋ"
  분리코드.push(15);
 break;
 case 25: //"ㅌ"
  분리코드.push(16);
 break;
 case 26: //"ㅍ"
  분리코드.push(17);
 break;
 case 27: //"ㅎ"
  분리코드.push(18);
 break;
 }
}
==========================================================================
정말 무식한 방법이었다. 식은 땀난다.

다음은 "ㅘ"같은 모음을 쪼개야한다. 이것도 일이다.
종성 때와 유사하다. 다음을 참고하자.
==========================================================================
switch(중성)        //중성 분석해서 넣고
{
 case 9:  //"ㅘ"       //이렇게 두개로 된건 둘로 쪼개주고~.
  분리코드.push(27);
  분리코드.push(19);
 break;
 case 10: //"ㅙ"
  분리코드.push(27);
  분리코드.push(20);
 break;
 case 11: //"ㅚ"
  분리코드.push(27);
  분리코드.push(39);
 break;
 case 14: //"ㅝ"
  분리코드.push(32);
  분리코드.push(23);
 break;
 case 15: //"ㅞ"
  분리코드.push(32);
  분리코드.push(24);
 break;
 case 16: //"ㅟ"
  분리코드.push(32);
  분리코드.push(39);
 break;
 case 19: //"ㅢ"
  분리코드.push(37);
  분리코드.push(39);
 break;
 default:
  분리코드.push(중성+19);
 break;
}
==========================================================================
보면 원래 중성코드에 19를 더해주었다.
초성코드와 구분해주기 위해서이다.
결과적으로 분리코드라는 배열에 자음과 모음의 코드가 들어간다.
자음은 초성 번호를 참고(0~18)하고
모음은 중성 번호에 19를 더한 값을 참고(19~39)하면 된다.

이제는 조합이라는 멋진 작업을 해야되는데... 이건 정말 괴로운 작업이라 할 수 있다.


조합은 2편에서 합니다. 기대하시라~ 두둥.