通过一个例子来看其关系
/**+---------------------------------------------------------- * 字符串截取,支持中文和其他编码+---------------------------------------------------------- * @static * @access public+---------------------------------------------------------- * @param string $str 需要转换的字符串 * @param string $start 开始位置 * @param string $length 截取长度 * @param string $charset 编码格式 * @param string $suffix 截断显示字符+---------------------------------------------------------- * @return string+---------------------------------------------------------- */function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){ if(function_exists("mb_substr")) return mb_substr($str, $start, $length, $charset); elseif(function_exists('iconv_substr')) { return iconv_substr($str,$start,$length,$charset); } $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); //通过preg_match_all将$str字符串进行编码,并返回给$match[0],按序排列组成数组 //通过array_slice将数组进行切割,然后通过join将切割后的数组的key进行连接 $slice = join("",array_slice($match[0], $start, $length)); if($suffix) return $slice."…"; return $slice;}
其中,join是implode的别名函数,将数组拼接成字符串,如果是关联数组,则只会进行key的连接
array_slice可以指定开始位置,和截取长度,进行切割
$str1 = "卧室字符串";echo mb_substr($str1,0,4,'utf-8')."\n";echo mb_strcut($str1,0,4,'utf-8')."\n";echo substr($str1,0,4)."\n";
上例输出:
卧室字符
卧卧�
可以看出substr是不支持中文的,但是mb_sbustr在安装php的时候需要安装mbstring扩展支持,windows服务器如果没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开
mb_substr和mb_struct 加上第三个参数后可以支持中文,但是mb_substr是按照字来截取的,mb_struct 是按字节截取的,但是两者都不会截取成半个字。。。