이번포스팅은 정말 엉뚱하게도 한글 전체 DB를 만드는 과정에서 한글 초성,중성,종성 단위로 분리할 수 있을까라는 의문점이 들어 시작되었다. 간혹 MAC 기기로 부터 받은 파일명들을 보면 한글이 초성,중성,종성 단위로 분리되어 표시가 되는데 정말 쓸떼없이 한번 만들어보고 싶었다.
일단 처음에는 내 얕은 지식을 통해 mb_ord로 열심히 규칙을 찾아보았지만 어떠한 규칙도 찾지 못하였다. 그러다가 구글링을 통해 완벽하게 구현된 자료를 확인할 수 있었다. 해당 자료링크는 아래와 같다.
역시나 오늘 소개할 함수 또한 위의 함수이며 아래의 함수는 조금 커스텀된 함수이니 원본 소스와 함께 참고하면 많은 도움이 될것같다.
<?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)는 그대로 출력이 된걸 알 수 있다.