PHP 개발을 하다 보면 우리나라의 언어 환경 문제로 인해 중국어를 다루어야 하는 경우가 많습니다. PHP에는 중국어의 길이를 가로채서 계산할 수 있는 특별한 mb_substr 및 mb_strlen 함수가 있다는 것을 우리 모두 알고 있습니다. 그러나 이러한 함수는 PHP의 핵심 기능이 아니기 때문에 활성화되지 않을 수 있습니다. 물론, 자체 서버를 사용하는 경우 php.ini에서만 활성화하면 됩니다. 가상호스트를 사용하는데 서버가 이 기능을 활성화하지 않는다면, 우리 나라 상황에 맞는 일부 기능을 작성해야 합니다.
다음 기능은 사용하기 매우 쉽습니다. 하지만 반드시 utf-8 환경에서 사용해야 한다는 점을 아셔야 합니다.
gb2312, gbk, utf-8, big5 중국어 차단 방식 지원
/* * 中文截取,支持gb2312,gbk,utf-8,big5 * * @param string $str 要截取的字串 * @param int $start 截取起始位置 * @param int $length 截取长度 * @param string $charset utf-8|gb2312|gbk|big5 编码 * @param $suffix 是否加尾缀 */ public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) { if(function_exists("mb_substr")) { if(mb_strlen($str, $charset) <= $length) return $str; $slice = mb_substr($str, $start, $length, $charset); } else { $re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/"; $re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/"; $re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/"; $re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/"; preg_match_all($re[$charset], $str, $match); if(count($match[0]) <= $length) return $str; $slice = join("",array_slice($match[0], $start, $length)); } if($suffix) return $slice."…"; return $slice; }