한글자르기 함수


3가지 함수를 통해 한글 자르기를 해보겠습니다.

함수1
function shortenStr($str, $maxlen) {

    if ( strlen($str) <= $maxlen )     // $str변수 바이트값이 $maxlen 크기보다 작거나 같으면
        return $str;                       // $str값을 리턴해준다

                                               // 여기부터 이해가 잘 안가네요
    $effective_max = $maxlen - 3;    // 최대 바이트 20이니  20-3=17 요값이 들어가는게 맞죠???
                                                // 3은 소스 마지막에 "..." 이 문자열 뒤에 붙기 때문입니다.

    $remained_byte = $effective_max;    // 이값을 다시 effective_max 값을 다시 remained_byte로 넘기면
                                                   // remained_byte 값은 17이 되는거 맞죠???

    $retStr="";         //$retStr 값은 아무것도 없는 공백
    $hanStart=0;        //$hanStart =0  왜 이값을 0으로 하는지 도대체 모르겄네용??
                        /*
                          위 두줄은 단지 변수를 초기화 시키고 있는 겁니다.
                          그런데 아래내용을 보면 $hasStart=false; 가 되어야 할 듯 싶어요...ㅡㅡ;
                       /*

    for ( $i=0; $i < $effective_max; $i++ ) {
        $char=substr($str,$i,1); // 문자열 첫글자 한글자씩 $char 변수에 넣음

        if ( ord($char) <= 127 ) {      //영문일 경우
            $retStr .= $char;              //$char 변수 값을  $reStr 변수에 넣음
            $remained_byte--;         //$remained_byte--;  -1값을 줌  왜 감소값을 주는건지 모르겠어용?
                                        /*
                                          $remained_byte 가 잘라야 할 바이트를 의미하기 때문입니다.
                                          영문자이기에 1바이트 줄었다는 의미죠.
                                        */
            continue;
        }

/*
여기부터는 위에서 영문을 확인했기 때문에 무조건 2바이트로 처리하는군요. (가장 어이없는 부분)
$hanStart 변수가 한글을 시작했는지를 의미하기에
!$hanStart 은 초기값이 0 이기에 true 가되고
$remained_byte 도 남은 문자열이 1보다 크다면 true 겠네요.
*/
        if ( !$hanStart && $remained_byte > 1 ) { //이부부은 도대체 hanstart 값이 0 이고 remained_byte
            $hanStart = true; // 한글이 시작되었다는 의미에서 true 로 설정하고 있습니다.
            $retStr .= $char; // 현재 $char 를 $retStr 에 붙이고
            $remained_byte--; // 역시 확인해야 할 남은 문자열에서 -- 를 해줍니다.
            continue;         // 그리고 루프를 돌죠.
        }
/*
위 continue 를 통해 루프가 새로돌면서
2바이트인 한글에서 두번째 바이트가 아래 조건에 충족하게됩니다.
바로 위에 조건에서 $hasStart 가 false 일때 처리하면서 $hasStart 를 true로 저장했기 때문이죠.
*/
        if ( $hanStart ) {      // 한글 문자열 처리가 시작되었는지를 확인함
            $hanStart = false;  // 여기서 한글 처리가 끝남을 저장합니다.
            $retStr .= $char;   // 여기 부터는 위와 같은 내용이죠
            $remained_byte--;
        }
    }
    return $retStr .= "...";
    // 문자열 마지막에 ... 을 붙여 잘렸다는 것을 알립니다. 이것 때문에 위에서 -3 을 해준 것이고요.
}



함수2
우선 위에 있는 소스를 간단히 처리해 보겠습니다.
오래전에 쓰던 방식이라 저도 좀 헷갈리네요.

function textCut($str, $limit, $suffix = '...') {
    $len = strlen($str);                               // 문자열 길이를 $len 에 저장
    if(!empty($limit) && $limit < $len ) {       // $limit 이 비어있지 않으며 $len 보다 작을 경우,
        $str = substr($str,0,$limit);                // $str 을 $limit 길이로 잘라서 다시 $str 에 저장
        for($i=0,$han=0;$i<$limit; $i++) {       // $limit 길이만큼 반복
            if(ord($str[$i]) > 127) $han++;       // 만약 2바이트 문자일 경우 $han++ 한다
        }
        if($han%2 == 1) $limit--;                 // $han 을 2로 나눴을 때 나머지가 1이 나온다면
                                                        // 현재 문자열 마지막이 깨진것으로 간주하고 $limit 에 -- 한다.
                                                       // 2바이트 문자이기 때문에 2로 나눴을 때 나머지가 나오면 안됩니다.
        $str = substr($str,0,$limit).$suffix;   // 새로운 $limit 을 반영하여 문자열을 자르고 $suffix 를 붙인다.
    }
    return $str;
}


함수3
이제 마지막으로, 요즘은 UTF-8 의 유니코드를 많이 사용하기 때문에 4바이트 문자도 무시할 수 없습니다.
그런데 다행이도 PHP에 지원하는 모듈이 있습니다. mbstring 이란 것인데,
PHP 소스 컴파일을 하신다면 --enable-mbstring 을 옵션으로 넣어주셔야 합니다.
현재 사용 가능한지 여부는 phpinfo() 를 통해 출력된 화면에서 mbstring 으로 검색을 해보세요.
사용 가능하시다면 아래 소스를 사용하실 수 있습니다.

$str = "안녕하세요. 반갑습니다.";
echo mb_strimwidth($str, 0, 10, "...", "UTF-8");

* 0 은 시작 포인트로써 문자열 맨 처음 부터 확인하라는 뜻입니다.
* 10 이 자를 문자열의 Byte 를 의미하며
* "..." 이 자른 후 뒤에 붙을 문자열
* "UTF-8" 은 현재 입력된 문자열의 인코딩 입니다.

참고로 10 은 문자열 뒤에 붙을 ... 까지 포함한 길이를 지정하시면 됩니다.
위 예제의 결과는 아래와 같습니다.


PHP메뉴얼은 아래 링크를 참고하세요.