Today I Learned …

[웹개발] 한글 종성 유무의 검증 본문

Web/APM

[웹개발] 한글 종성 유무의 검증

염베리 2021. 12. 20. 07:00

* 개인적인 공부 내용을 기록한 글입니다.


사담

친구 웹 만들다가... 급 꽂혀서 구현해봤다.


한글 종성 유무의 검증

 

 

평화로운 웹개발 중...

 

[2]으로 검색한 결과입니다.

[나무]으로 검색한 결과입니다.

 

갑자기 확 거슬리기 시작했다...

그런고로 열심히 뒤져서 구현해봤다.

 

 

전체 코드

$last = iconv_substr($search, -1, 1, "utf-8");
$dec = substr(mb_convert_encoding($last,'HTML-ENTITIES','UTF-8'),2,-1);
$nums = array("3","6","0");

if($dec>=44032 && $dec<=55203){
	if(($dec-44032)%28!=0){
		$josa = "으로";
	}else{
		$josa = "로";
	}
}elseif(in_array($last, $nums)){
	$josa = "으로";
}else{
	$josa = "로";
}

 

 

한 줄 씩 뜯어보기

 

$last = iconv_substr($search, -1, 1, "utf-8");

⇒ 검색어의 마지막 글자를 가져온다. 한글을 있는 그대로 자르려면 iconv_substr를 사용해주어야 한다.


$dec = substr(mb_convert_encoding($last,'HTML-ENTITIES','UTF-8'),2,-1);

⇒ $last를 10진수로 바꿔준다.


$nums = array("3","6","0");

⇒ 발음할 때 삼, 육, 십이 되는 친구들도 배열에 넣어준다.

* 받침이 있지만 제외된 숫자들이 있다. 직접 발음해보면 이유를 알 수 있다...


if($dec>=44032 && $dec<=55203)

⇒ 해당 문자가 한글이라면, 다음의 검증을 수행한다.

 

if(($dec-0xAC00)%28!=0)

⇒ 해당 문자에서 44032을 뺀 값이 28로 나누어 떨어지지 않는다면 → 받침이 있는 글자이다.

* 유니코드 = 44032 + (초성 * 21 + 중성) * 28 + 종성

따라서 종성이 있는 글자는 유니코드-44032를 28로 나누었을 때 나머지가 남게 된다.

참고로 위 공식에서의 초성, 중성, 종성은 각 자모의 Index를 말한다.


$josa = "으로" / $josa = "로"

⇒ 경우에 따라 조사의 형태를 정해준다.

 

 

결과

 

프로필사진
berry
FE Developer, loves React & better DX
Comments