[백업][가리사니] php utf 8 기준, 한글을 초성,중성,종성으로 분리하기
php

이 문서는 가리사니 개발자 포럼에 올렸던 글의 백업 파일입니다. 오래된 문서가 많아 현재 상황과 맞지 않을 수 있습니다.

이글의 출처는 다음과 같습니다.

http://blog.arzz.com/192

Ajax를 이용한 키워드 자동완성을 만들며, 초성만 입력했을때도 해당되는 키워드를 가져오기 위해, 삽질끝에 만든 한글을 초.중.종성으로 분리하기 함수입니다. :) 인터넷에 퍼져있는 유니코드와 관련된 정보를 모아다가 짜집기로 만든거라, 허접할 수 있음을 미리 공지합니다. ^^;;

일단 작동방식은 "알쯔's 외부기억장치"과 같은 문장을 함수에 넣으면 "ㅇㅏㄹㅉㅡ'sㅇㅚㅂㅜㄱㅣㅇㅓㄱㅈㅏㅇㅊㅣ" 와 같은 문자열을 반환합니다.

즉, 한글일 경우, 자음과 모음, 그리고 받침을 따로 분리하고, 한글외의 문자열은 그대로 반환하며, 띄워쓰기는 무시합니다. 띄워쓰기도 그대도 반환하실려면, 함수 제일 아래쪽의 $splitStr = str_replace(' ','',$splitStr); 부분을 지워주시면 됩니다.

<?php
function GetUtf8String($str) {
	$arr_cho = array("ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ","ㅂ", "ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ","ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ");
	$arr_jung = array("ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ","ㅖ", "ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ","ㅝ", "ㅞ", "ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ");
	$arr_jong = array("", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ","ㄷ", "ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ","ㄿ", "ㅀ", "ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ","ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ");

	$unicode = array();
	$values = array();
	$lookingFor = 1;

	for ($i=0, $loop=strlen($str);$i<$loop;$i++) {
		$thisValue = ord($str[$i]);

		if ($thisValue < 128) {
			$unicode[] = $thisValue;
		} else {
			if (count($values) == 0) $lookingFor = $thisValue < 224 ? 2 : 3;
			$values[] = $thisValue;

			if (count($values) == $lookingFor) {
				$number = $lookingFor == 3 ? (($values[0]%16)*4096)+(($values[1]%64)*64)+($values[2]%64) : (($values[0]%32)*64)+($values[1]%64);
				$unicode[] = $number;
				$values = array();
				$lookingFor = 1;
			}
		}
	}

	$splitStr = '';
	while (list($key,$code) = each($unicode)) {
		if ($code >= 44032 && $code <= 55203) {
			$temp = $code-44032;

			$cho = (int)($temp/21/28);
			$jung = (int)(($temp%(21*28)/28));
			$jong = (int)($temp%28);

			$splitStr.= $arr_cho[$cho].$arr_jung[$jung].$arr_jong[$jong];
		} else {
			$temp = array($unicode[$key]);

			foreach ($temp as $ununicode) {
				if ($ununicode < 128) {
					$splitStr.= chr($ununicode);
				} elseif ($ununicode < 2048) {
					$splitStr.= chr(192+(($ununicode-($ununicode%64))/64));
					$splitStr.= chr(128+($ununicode%64));
				} else {
					$splitStr.= chr(224+(($ununicode-($ununicode%4096))/4096));
					$splitStr.= chr(128+((($ununicode%4096)-($ununicode%64))/64));
					$splitStr.= chr(128+($ununicode%64));
				}
			}
		}
	}
	$splitStr = str_replace(' ','',$splitStr);

	return $splitStr;
}

// UTF-8 문자열 생성
$str = iconv('euc-kr','utf-8','알쯔\'s 외부기억장치');

echo GetUtf8String($str);
// return ㅇㅏㄹㅉㅡ'sㅇㅚㅂㅜㄱㅣㅇㅓㄱ ㅈㅏㅇㅊㅣ(http://blog.arzz.com)
?>