한글은 초성, 중성, 종성으로 이루어져 있다.
초성은 19개 : 'ㄱ', 'ㄲ', 'ㄴ', 'ㄷ', 'ㄸ', 'ㄹ', 'ㅁ', 'ㅂ', 'ㅃ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅉ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'
중성은 21개 : 'ㅏ', 'ㅐ', 'ㅑ', 'ㅒ', 'ㅓ', 'ㅔ' ,'ㅕ', 'ㅖ' ,'ㅗ' ,'ㅘ', 'ㅙ', 'ㅚ', 'ㅛ', 'ㅜ', 'ㅝ', 'ㅞ', 'ㅟ', 'ㅠ', 'ㅡ', 'ㅢ', 'ㅣ'
종성은 28개 : ' ', 'ㄱ', 'ㄲ', 'ㄳ', 'ㄴ', 'ㄵ', 'ㄶ', 'ㄷ', 'ㄹ', 'ㄺ', 'ㄻ', 'ㄼ', 'ㄽ', 'ㄾ', 'ㄿ', 'ㅀ', 'ㅁ', 'ㅂ', 'ㅄ', 'ㅅ', 'ㅆ', 'ㅇ', 'ㅈ', 'ㅊ', 'ㅋ', 'ㅌ', 'ㅍ', 'ㅎ'
종성의 첫번째는 공백으로 되있다.
한글 유니코드의 범위는 0xAC00 ~ 0xD7A3사이로 일정한 공식에 의해 초, 중, 종성을 분리, 결합 할 수 있다.
먼저 유니코드에서 한글 코드의 초, 중, 종성 분리는 다음과 같다.
초성 : (한글 유니코드 - 0xAC00) / (28*21)
중성 : ((한글 유니코드 - 0xAC00) % (28*21)) / 28
종성 : (한글 유니코드 - 0xAC00) % 28
위와 같은 계산을 거치면 초, 중, 종성의 index가 나온다.
예를 들어 '공' (0xACF5) 이라는 한글을 분리하면
초성 : 0
중성 : 8
종성 : 21
위와 같은 index를 얻어낼 수 있다.
----------------------------------------------------------------------------------------------------
var arr:Array = new Array;
function divide(str:String)
{
var unicode:Number = str.charCodeAt(0);
var num:Number = unicode - 0xAC00;
var cho:Number = Number(num / 588);
var jung:Number = Number(num / 28 ) % 21;
var jong:Number = num % 28 - 1;
if(jong>6 && jong<17)
{
jong+=1;
}
else if(jong>16 && jong<22)
{
jong+=2;
}
else if(jong>21)
{
jong+=3;
}
if(cho == 2 )
{
cho+=1;
}
else if(cho>2 && cho<6)
{
cho+=3;
}
else if(cho>5 && cho<9)
{
cho+=10;
}
else if(cho>8)
{
cho+=11;
}
//0xAC00 + (0 * (28*21)) + (8 * 28) + 21 = 0xACF5
trace(String.fromCharCode(0xAC00 + (cho * (28*21))))
arr.push(String.fromCharCode(cho+0x3131)); // 초성 자음 문자
arr.push(String.fromCharCode(jung+0x314f)); // 중성 모음 문자
if(jong>-1)arr.push(String.fromCharCode(jong+0x3131)); // 종성 자음 문자
}
function divides(str:String)
{
for(var i:Number=0; i<str.length; i++)
{
divide(str.charAt(i));
}
trace(arr);
}
divides("슭곰발");