인터넷정보

[PHP] 한글 초성,중성,종성 자르기

알 수 없는 사용자 2007. 10. 10. 14:06
<?
/*========================================
han_split.php (js_han_split.js의 php버전);
한글 초성,중성,종성 자르기

사용법
arr = han_split('뷃');
arr -> array('ㅂ','ㅞ','ㄼ');

원리
한글의 유니코드는
초성 기준으로 588개로 나눌 수 있다.(가~깋:588개, 하~힣도 갯수가 같다)
초성 19개, 중성은 21개, 종성은 28개로 나눠지는데, 이것이 일정하게 나뉜다.
그 규칙을 바탕으로 초,중,종성의 차이를 계산해서 초,중,종성을 알아낸다.

한글이 아닌 것은 무시합니다.

mins01,mins,공대여자
MSN,NateOn : mins01(at)lycos.co.kr
2007-03-06
"공대여자는 예쁘다."를 나타내야만 쓸 수 있습니다.
//========================================*/
function han_split_string($string='',$enc_type='EUC-KR'
){
//문자열을 처리할 때
   
$re_arr
= array();
    for(
$i=0,$m=mb_strlen($string,$enc_type);$i<$m;$i
++){
       
$char = mb_substr($string,$i,1,$enc_type
);
        if(
$char=='&'
){
           
$char=''
;
            while(
$char2!=';' && $i<$m
){
               
$char2 = mb_substr($string,$i++,1,$enc_type
);
               
$char .= $char2
;
            }
           
$i
--;
        }
       
$re_arr[] = han_split($char,$enc_type
);
    }
    return
$re_arr
;
}
function
han_split($char='',$enc_type='EUC-KR'
){
//글자 하나만 처리할 때
   
$char_st = 44032 ;
//'가'의 유니코드 넘버(10진수)
   
$char_ed = 55203 ;
//'힝'의 유니코드 넘버(10진수)
    //초성구분 : 588단위로 잘림
    //가까나다따라마바빠사싸아자짜차카타파하 :초성 19개
    //가개갸걔거게겨계고과괘괴교구궈궤귀규그긔기 : 중성 21개
    //가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛 : 종성 28개
   
$arr_1st=array('ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ');
//초성 19개
   
$arr_2nd=array('ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ','ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ','ㅣ');
//중성 21개
   
$arr_3th=array('','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ');
//종성 28개
   
   
if(strpos($char,'&#')===false){
//HTML엔티티가 아닐 경우

       
$char = mb_convert_encoding($char, "UTF-16", $enc_type
);
       
$char = mb_substr($char,0,1,"UTF-16"
);
       
$char_hex = ''
;
        for(
$i=0,$m=strlen($char);$i<$m;$i
++){
           
$char_hex .= sprintf('%02s',base_convert(ord($char{$i}),10,16
));
        }
       
//print("문자열 길이 : $m<br/>");
        //print("16진수문자열 : $char_hex<br/>");
       
$char_int=base_convert($char_hex,16,10
);        
    }else{
       
$char_int = preg_replace('/[^0-9]/','',$char
);
    }

//    print "$char<br>";
//    print "$char_hex<br>";
//    print "$char_int";
//print("$char_int < $char_st || $char_int > $char_ed");
   
if($char_int < $char_st || $char_int > $char_ed) return false;
//한글이 아니다
   
$uninum2 = $char_int-$char_st
;
   
$arr_1st_v = floor($uninum2/588
);
   
$uninum2 = $uninum2%588
;
   
$arr_2nd_v = floor($uninum2/28
);
   
$uninum2 = ($uninum2%28
);
   
$arr_3th_v = $uninum2
;
   
$return_arr=array($arr_1st[$arr_1st_v],$arr_2nd[$arr_2nd_v],$arr_3th[$arr_3th_v
]);
    return
$return_arr
;
}
?>
반응형