이번포스팅은 정말 엉뚱하게도 한글 전체 DB를 만드는 과정에서 한글 초성,중성,종성 단위로 분리할 수 있을까라는 의문점이 들어 시작되었다. 간혹 MAC 기기로 부터 받은 파일명들을 보면 한글이 초성,중성,종성 단위로 분리되어 표시가 되는데 정말 쓸떼없이 한번 만들어보고 싶었다. 

 

일단 처음에는 내 얕은 지식을 통해 mb_ord로 열심히 규칙을 찾아보았지만 어떠한 규칙도 찾지 못하였다. 그러다가 구글링을 통해 완벽하게 구현된 자료를 확인할 수 있었다.  해당 자료링크는 아래와 같다. 

 
PHP 한글 초성, 중성, 종성 분리 linear hangul() - 제타위키
PHP 한글 초성, 중성, 종성 분리 linear hangul() - 제타위키
zetawiki.com/wiki/PHP_%ED%95%9C%EA%B8%80_%EC%B4%88%EC%84%B1,_%EC%A4%91%EC%84%B1,_%EC%A2%85%EC%84%B1_%EB%B6%84%EB%A6%AC_linear_hangul()

 

역시나 오늘 소개할 함수 또한 위의 함수이며 아래의 함수는 조금 커스텀된 함수이니 원본 소스와 함께 참고하면 많은 도움이 될것같다. 

 

소스코드 
<?php 
// mb_ord 함수는 PHP 7.2.0 이상에서 사용 가능하여 서포트 함수를 만들어준다. 
if( !function_exists('mb_ord')){
	function mb_ord($charUTF8)
	{
		$charUCS4 = mb_convert_encoding($charUTF8, 'UCS-4BE', 'UTF-8');
		$byte1 = ord(substr($charUCS4, 0, 1));
		$byte2 = ord(substr($charUCS4, 1, 1));
		$byte3 = ord(substr($charUCS4, 2, 1));
		$byte4 = ord(substr($charUCS4, 3, 1));
		return ($byte1 << 32) + ($byte2 << 16) + ($byte3 << 8) + $byte4;
	}
}
// 한글변환함수 -> https://zetawiki.com/wiki/PHP_%ED%95%9C%EA%B8%80_%EC%B4%88%EC%84%B1,_%EC%A4%91%EC%84%B1,_%EC%A2%85%EC%84%B1_%EB%B6%84%EB%A6%AC_linear_hangul() 참고 
function linear_hangul($str) {
	$items = array(
		'cho'=>array('ㄱ','ㄲ','ㄴ','ㄷ','ㄸ','ㄹ','ㅁ','ㅂ','ㅃ','ㅅ','ㅆ','ㅇ','ㅈ','ㅉ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ'),
		'jung'=>array('ㅏ','ㅐ','ㅑ','ㅒ','ㅓ','ㅔ','ㅕ','ㅖ','ㅗ','ㅘ','ㅙ','ㅚ','ㅛ','ㅜ','ㅝ','ㅞ','ㅟ','ㅠ','ㅡ','ㅢ','ㅣ'),
		'jong'=>array('','ㄱ','ㄲ','ㄳ','ㄴ','ㄵ','ㄶ','ㄷ','ㄹ','ㄺ','ㄻ','ㄼ','ㄽ','ㄾ','ㄿ','ㅀ','ㅁ','ㅂ','ㅄ','ㅅ','ㅆ','ㅇ','ㅈ','ㅊ','ㅋ',' ㅌ','ㅍ','ㅎ'),
	);
	$result = '';
	$exStr = mb_str_split($str,1);
	foreach($exStr as $k=>$v){
		$code = mb_ord($v,'utf-8') - 44032;
		if ($code > -1 && $code < 11172) {
			$cho_idx = $code / 588;
			$jung_idx = $code % 588 / 28;
			$jong_idx = $code % 28;
			$result .= $items['cho'][$cho_idx].$items['jung'][$jung_idx].$items['jong'][$jong_idx];
		} else {
			$result .= $v;
		}		
	}
	return $result;
}

 

| 예제소스

<?php
echo linear_hangul('레드인포삵.api');

 

| 예제결과 

ㄹㅔㄷㅡㅇㅣㄴㅍㅗㅅㅏㄺ.api

 

예제결과에서 보면 알 수 있듯이 한글의 초성,중성,종성 등이 분리되었고 이외 글자(.api)는 그대로 출력이 된걸 알 수 있다.