UTF-8 기준, 한글을 초성,중성,종성으로 분리하기

Author : 알쯔 / Date : 2006.02.04 16:52 / Category : 팁로그

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

일단 작동방식은 [알쯔's 외부기억장치(http://blog.arzz.com)](UTF-8)과 같은 문장을 함수에 넣으면 [ㅇㅏㄹㅉㅡ'sㅇㅚㅂㅜㄱㅣㅇㅓㄱㅈㅏㅇㅊㅣ(http://blog.arzz.com)] 와 같은 문자열을 반환합니다.

즉, 한글일 경우, 자음과 모음, 그리고 받침을 따로 분리하고, 한글외의 문자열은 그대로 반환하며, 띄워쓰기는 무시합니다.
띄워쓰기도 그대도 반환하실려면, 함수 제일 아래쪽의 $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)
?>
신고

Tags : , , ,

Trackbacks 0 / Comments 20

  • 스완 2006.02.04 23:32 신고

    와... 직접 만드신거군요 : )
    대단하십니다 +_+ 고칠점은 모르겠지만, 잘쓰겠습니다 : )

    REPLY / EDIT

    • Favicon of http://blog.arzz.com 알쯔 2006.02.05 01:23 신고

      ^^;;
      오락하느라고 메신져를 못봤네요 ㅠ_ㅠ
      유용하게 사용하시길-

      EDIT

  • 2006.02.04 23:45

    비밀댓글입니다

    REPLY / EDIT

  • Favicon of http://howl.pe.kr 하울 2006.02.11 03:26 신고

    알쯔님 함수 좋은데요. 만드신다고 수고하셨습니다.
    오픈유어북에 만드신 함수 가져다 붙였는데 괜찮죠? ^^
    그럼 항상 건강하시고 행복하세요!!!

    REPLY / EDIT

    • Favicon of http://blog.arzz.com 알쯔 2006.02.13 13:11 신고

      넵- 가져가서 사용하라고 공개한것인데 안 괜찮을리가;; ^^;; 잘 사용해주시면 너무 감사하구요~
      하울님도 건강하시고- 감기조심하세요 ^^;

      EDIT

  • 태양공원 2006.02.17 10:42 신고

    먼저, 좋은 함수 만드느라 수고하셨구요
    근데 공백을 반영하기 위해 공백제거 하는 부분을 주석처리하고 처리했는데 문제가 발생했습니다.
    원단어의 띄어쓰기와 다르게 띄어쓰기 형태로 분리되더군요

    "마 추섬의 비극" 이라는 단어를 분리했을때 초중성 분리는 잘 되는데 띄어쓰기가 "마 추섬 의 비극" 이런식으로 돼요
    물론 대부분의 단어는 잘 되지만 이 단어뿐 아니라 다른 많은 단어들이 띄어쓰기가 다르게 돼요.. 왜그럴까요?

    REPLY / EDIT

    • Favicon of http://blog.arzz.com 알쯔 2006.02.24 03:50 신고

      흠... 그부분에 대해서는 저도 잘 모르겠네요 :)
      시간날때 한번더 뜯어봐야할듯 하네요 ㅠㅠ

      EDIT

  • Favicon of http://tody.teoal.net/ 까비 2006.02.22 13:58 신고

    아... 올블로그 딱지가 이럴 때 좋네요. ^^; '한글' 딱지를 붙여서 글을 하나 쓰고 링크를 따라오다 보게 됐습니다.

    참고로, Ajax에서 다루신다면 자바스크립트로 직접 한글을 다루는게 짧은 코드로 처리가 가능해서 좋습니다. UTF-8이든 EUC-KR이든 가리지 않고 바로 유니코드를 뱉어 주더라구요. (http://tody.teoal.net/archives/119)

    php로 해야한다면... MoniWiki에 비슷하게 구현이 되어 있을거 같네요.

    REPLY / EDIT

    • Favicon of http://blog.arzz.com 알쯔 2006.02.24 03:52 신고

      딱지라고 하셔서 순간 무엇인가 했답니다... 태그를 말씀하신듯 하네요-
      그리고 말씀해주신, 자바스크립트로 구현하는 부분... 좋은 공부가 되었구요.
      이번같은 경우는, 한글분리가 목적이라기보단, DB에 커넥팅해서, 쿼리값을 받아오는게 목적이었다보니, 직접 DB에 접근할 수 있는 PHP로 하는게 나을듯 해서... ^^;;

      EDIT

  • Favicon of http://www.giristory.net 길이 2006.09.01 20:11 신고

    공백반영시 위의 소스를 그대로 사용할 경우... "태양공원"님의 말씀처럼 몇몇 단어들이 공백오류를 일으키는데요... 받침"ㅁ"이 들어가는 단어들이 문제가 됩니다.
    이유는 $arr_jong 배열의 "ㅁ"부분뒤에.. 공백이 하나 숨어 있습니다. 그걸 제거하시면 해결이 될껍니다. ^^

    REPLY / EDIT

    • Favicon of http://blog.arzz.com 알쯔 2006.09.02 12:18 신고

      앗 감사합니다. + _+
      수정해서 올려두어야겠네요~

      EDIT

  • 드렁크수달스 2006.12.08 13:39 신고

    감사합니다. 이걸보고 응용좀해봐야 겠습니다.

    REPLY / EDIT

  • 음 많이 오래됐지만; 2011.01.20 02:48 신고

    for ($i=0, $loop=strlen($str);$i<$loop;$i++) {
    이런식으로 루프문에 strlen처럼 함수를 쓰는건 좋지 않습니다.
    속도면에서요.
    for문을 실행할 때마다 strlen문을 실행하거든요.
    이런 경우 그냥 strlen부분을 타 변수에 저장하는 쪽이 좋습니다.

    REPLY / EDIT

    • 머냐 2011.01.25 21:40 신고

      가만히나 있으면 중간이라도 하지.
      for ( 루프진입시 한번만 실행 ; 루프때마다 실행 ; 루프때마다 실행 )
      for 의 기본아님?
      즉 strlen 함수는 루프진입할때 한번밖에 호출안됨.

      EDIT

  • 음 많이 오래됐지만; 2011.01.20 02:51 신고

    while문 보다는 foreach로 접근하는게 더 좋을듯 싶네요.
    머.. 글이 오래된거라 태클 거는 것도 이상하지만;

    REPLY / EDIT

  • 음 많이 오래됐지만; 2011.01.20 02:51 신고

    while문 보다는 foreach로 접근하는게 더 좋을듯 싶네요.
    머.. 글이 오래된거라 태클 거는 것도 이상하지만;

    REPLY / EDIT

  • 넌머냐 2011.02.12 02:56 신고

    둘다 듣보잡이면서 풋ㅋ

    REPLY / EDIT

  • Favicon of http://papership.co.cc Papership 2012.01.22 16:24 신고

    세상에 ㅎㅎ 완전 감사합니다 :)

    REPLY / EDIT

  • 감자 2017.04.10 22:13 신고

    안녕하세요 ㅎㅎ
    궁금한 점이 있는데요
    저 소스를 실행하면 왜 아래와 같이 나오나요?

    ����������'s���ʤ��̤��Ӥ��ä�����������

    REPLY / EDIT

Follow Me

Search

Statistics

  • Total : 2,137,686
  • Today : 156
  • Yesterday : 783

Blog Information

알쯔

Calendar

«   2017/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Copyright © 알쯔의 외부기억장치 All Rights Reserved
Powered by ARZZ.COM