완성형 한글의 경우 한글은 2바이트로 영어는 1바이트로 구성되기 때문에 PHP의 substr() 함수를 쓸 때 한글이 깨지는 경우가 있다. 이런 경우 mb_substr() 함수로 대체하면 된다.
substr ($str, $start_Pos, $length);
$Str에 담고 있는 문자열의 $start_Pos부터 길이$length만큼을 잘라내어 반환한다
mb_substr ($str, $start_Pos, $length, $encoding);
$str에 담고 있는 문자열의 $start_Pos부터 길이$length만큼을 잘라내어 $encoding 형식에 맞게 반환한다
mb_substr($str, 0, 10, 'EUC-KR');
mb_substr($str, 0, 10, 'UTF-8');
function strcut_euckr($msg, $limit) { // 완성형 한글 자르기
$msg = substr($msg, 0, $limit);
for ($i = $limit - 1; $i > 1; $i--) {
if (ord(substr($msg,$i,1)) < 128) break;
}
$msg = substr($msg, 0, $limit - ($limit - $i + 1) % 2);
return $msg;
}
function strcut_utf8($str, $len, $checkmb=false, $tail='') { // UTF-8 한글자르기
/** UTF-8 Format
* 0xxxxxxx = ASCII, 110xxxxx 10xxxxxx or 1110xxxx 10xxxxxx 10xxxxxx
* latin, greek, cyrillic, coptic, armenian, hebrew, arab characters consist of 2bytes
* BMP(Basic Mulitilingual Plane) including Hangul, Japanese consist of 3bytes
**/
preg_match_all('/[\xE0-\xFF][\x80-\xFF]{2}|./', $str, $match); // target for BMP
$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;
}