[utf-8, PHP5] 한글 자르기 > 그누4 팁자료실

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.

[utf-8, PHP5] 한글 자르기 정보

[utf-8, PHP5] 한글 자르기

본문

그누보드/lib/common.lib.php line 890

// 한글 한글자(2byte)는 길이 2, 공란.영숫자.특수문자는 길이 1
function cut_str($str, $len, $suffix="…")
{    $s = iconv_substr($str, 0, $len, "utf-8");  //<-- 여기 추가, 아래 주석처리 !
//    $s = substr($str, 0, $len);
//    $cnt = 0;
//    for ($i=0; $i<strlen($s); $i++)
//        if (ord($s[$i]) > 127)
//            $cnt++;
//    $s = substr($s, 0, $len - ($cnt % 2));
    if (strlen($s) >= strlen($str))
        $suffix = "";
    return $s . $suffix;
}

* 참고: PHP5에 iconv_substr( string str, int offset [, int length [, string charset]] ) 내장되었네요.
* utf-8 적용시 cut_str()으로 잘 안될 때가 있어서 수정해봤습니다.
추천
1

댓글 6개

PHP4에서도 extention으로 iconv가 가능은 한것 같던데.... (사용은 제대로 못해봤군요...)
mb_string을 사용하는 것은 어떨까요? extention으로 지원하는데요... (PHP 4 >= 4.0.6, PHP 5)
KOI8-R, EUC-KR, UTF-8 도 가능하고 mb_substr, mb_split, mb_strcut, mb_strlen, mb_substr_count 등과
정규식 함수(mb_ereg...)를 포함하여 웬만한 PHP의 String 함수들은 가능하거든요...
iconv를 이용해서 변환을 해도 되지만 utf8 그대로 자르는 것도 가능해서 한번 만들어봤습니다.
utf8은 바이트수가 3~6 바이트까지 차지하므로(한글은 거의 3바이트) euckr에 비해 1.5배가량 넉넉하게 글자수를 지정해줘야 비슷한 만큼 잘리는거 주의하시고요^^
utf8은 글자 중간에 딱 찝었을때도 이게 한글인지 아닌지 파악이 가능하기때문에 일반적인 멀티바이트 자르기보다 훨씬 루프를 적게 돌고 자를 수 있습니다.
사이트 전체가 utf8로 된 경우라면 활용하세요 (_ _)

function utf8_cutstr($str,$len,$tail='') {
    $c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
    if ($c == '10')
        for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
    return substr($str,0,$len) . (strlen($str)-strlen($tail) >= $len ? $tail : '');
}

header('Content-Encoding: UTF-8');
$str ="UTF8로 작성된 한글 메시지 123 ★♧ 家羅多";
for ($i=1,$cnt=strlen($str);$i<=$cnt;$i++) {
    echo "{$i}: ". utf8_cutstr($str,$i,'...'). '<br />';
}
좋은 방법인 것 같습니다. 감사합니다. 다만 warning이 있어 보니 $str{$len}에서 $len 값은 반드시 $str의 길이에서 하나뺀 값보다 작아야 하므로(스트링의 시작은 1이 아니라 0 이므로) 다음과 같이 수정해서 warning을 없앴습니다.

function utf8_cutstr($str,$len,$tail='')
{
if ($len < strlen($str)) {
$c = substr(str_pad(decbin(ord($str{$len})),8,'0',STR_PAD_LEFT),0,2);
    if ($c == '10')
    for (;$c != '11' && $c{0} == 1;$c = substr(str_pad(decbin(ord($str{--$len})),8,'0',STR_PAD_LEFT),0,2));
}
    return substr($str,0,$len) . (strlen($str)-strlen($tail) >= $len ? $tail : '');
}
전체 3,313 |RSS
그누4 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT