사이트 내 전체검색
PHP
[PHP] UTF-8 한글 자르기
로빈아빠
https://cmd.kr/php/787 URL이 복사되었습니다.

본문

utf-8 한글을 자르기 위한 함수입니다. javascript 처럼 멀티바이트 글자에 대해 1문자로 취급할 수도 있도록 했습니다. 원래대로라면 utf-8 으로 된 한글은 3byte 이지만, 익숙한 계산법을 따르기 위해서 이 함수에서는 2byte인 것처럼 취급합니다. 즉, 다음과 같습니다.

원본
한글과 English를 혼용해서 씁니다.
checkmb=true, len=10
한글과 Eng (한글=2*3 + 공백=1*1 + 영문=1*1 => 10)

checkmb=false, len=10
한글과 Englis (모두 합쳐 10자)

$a = '한글hangul도 포함include되었습니다.';

/**
* cut string in utf-8
* @author gony (http://mygony.com)
* @param $str     source string
* @param $len     cut length
* @param $checkmb if this argument is true, the function treats multibyte character as two bytes. default value is false.
* @param $tail    abbreviation symbol
* @return string  processed string
*/
function strcut_utf8($str, $len, $checkmb=false, $tail='...') {
    preg_match_all('/[\xEA-\xED][\x80-\xFF]{2}|./', $str, $match);

    $m    = $match[0];
    $slen = strlen($str);  // length of source string
    $tlen = strlen($tail); // length of tail string
    $mlen = count($m); // length of matched characters
    
    if ($slen < = $len) return $str;
    if (!$checkmb && $mlen <= $len) return $str;
    
    $ret   = array();
    $count = 0;
    
    for ($i=0; $i < $len; $i++) {
        $count += ($checkmb && strlen($m[$i]) > 1)?2:1;
    
        if ($count + $tlen > $len) break;
        $ret[] = $m[$i];
    }
    
    return join('', $ret).$tail;
}

파라미터 설명 
String $str : 원본 문자열
Integer $len : 문자열을 자를 길이
Boolean $checkmb : 이 값을 true로 하면 한글을 영문2자와 같이 취급한다. 기본값은 false
String $tail : 생략후 붙일 줄임 기호

반환값
{String} 처리된 문자열

주의! 이 함수는 UTF-8 문자열을 다룹니다. 다른 charset 에는 적용되지 않습니다.

mb_ 계열 함수가 없는 환경을 위해서 만들어봤습니다.
거의 없을 줄 알았는데 아직도 그런 환경이 있기는 있더라구요. ^^;;

댓글목록

로빈아빠님의 댓글

profile_image 로빈아빠 작성일

확인결과 잘안되네요..


<?

$sub= "가나다1234";
echo strcut_utf8($sub,2),"<BR>";


function strcut_utf8($str, $len, $checkmb=false, $tail='...') {
    preg_match_all('/[\xEA-\xED][\x80-\xFF]{2}|./', $str, $match);

    $m    = $match[0];
    $slen = strlen($str);  // length of source string
    $tlen = strlen($tail); // length of tail string
    $mlen = count($m); // length of matched characters
   
    if ($slen <= $len) return $str;
    if (!$checkmb && $mlen <= $len) return $str;
   
    $ret  = array();
    $count = 0;
   
    for ($i=0; $i < $len; $i++) {
        $count += ($checkmb && strlen($m[$i]) > 1)?2:1;
   
        if ($count + $tlen > $len) break;
        $ret[] = $m[$i];
    }
   
    return join('', $ret).$tail;
}
?>

로빈아빠님의 댓글

profile_image 로빈아빠 작성일

mb_str 함수는 되는데 2바이트를 1바이트로 계산한다.
<?
$sub= "가나다1234";
echo mb_strlen($sub,"utf-8"),"<BR>";
echo mb_substr($sub,2,2,"utf-8"),"<BR>";
?> 
결과:
7
다1

PHP
871 (4/18P)

Search

Copyright © Cmd 명령어 3.145.47.193