字符串截断
//测试时文件的编码方式要是UTF8
$str='中文a字1符';
echo strlen($str).'
';//14
echo mb_strlen($str,'utf8').'
';//6
echo mb_strlen($str,'gbk').'
';//8
echo mb_strlen($str,'gb2312').'
';//10
/*
结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以“中文a字1符”长度是3*4+2=14
在mb_strlen计算时,选定内码为UTF8,则会将一个中文字符当作长度1来计算,所以“中文a字1符”长度是6
*/
//利用这两个函数则可以联合计算出一个中英文混排的串的占位是多少(一个中文字符的占位是2,英文字符是1)
echo (strlen($str) + mb_strlen($str,'UTF8')) / 2;
//例如 “中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,则可以计算出“中文a字1符”的占位是10.
echo mb_internal_encoding();
PHP内置的字符串长度函数strlen无法正确处理中文字符串,它得 到的只是字符串所占的字节数。对于GB2312的中文编码,strlen得到的值是汉字个数的2倍,而对于UTF-8编码的中文,就是3倍的差异了(在 UTF-8编码下,一个汉字占3个字节)。
采用mb_strlen函数可以较好地解决这个问题。mb_strlen的用法和 strlen类似,只不过它有第二个可选参数用于指定字符编码。例如得到UTF-8的字符串$str长度,可以用 mb_strlen($str,'UTF-8')。如果省略第二个参数,则会使用PHP的内部编码。内部编码可以通过 mb_internal_encoding()函数得到。需要注意的是,mb_strlen并不是PHP核心函数,使用前需要确保在php.ini中加载 了php_mbstring.dll,即确保“extension=php_mbstring.dll”这一行存在并且没有被注释掉,否则会出现未定义函 数的问题。
1、使用mbstring扩展库的mb_substr截取就不会出现乱码了。
2、自己书写截取函数,但效率不如用mbstring扩展库来得高。
3、如果仅是为了输出截取的串,可用如下方式实现:substr($str, 0, 30).chr(0)。
=============================
substr()函数可以分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mb_substr()/mb_strcut这个函数,mb_substr()/mb_strcut的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。
举个例子:
echo mb_substr('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一来我的字
echo mb_strcut('这样一来我的字符串就不会有乱码^_^', 0, 7, 'utf-8');
?>
输出:这样一
从上面的例子可以看出,mb_substr是按字来切分字符,而mb_strcut是按字节来切分字符,但是都不会产生半个字符的现象。
=============================
PHP实现中文字串截取无乱码的方法
function GBsubstr($string, $start, $length) {
if(strlen($string)>$length){
$str=null;
$len=$start+$length;
for($i=$start;$i
if(ord(substr($string,$i,1))>0xa0){
$str.=substr($string,$i,2);
$i++;
}else{
$str.=substr($string,$i,1);
}
}
return $str.'...';
}else{
return $string;
}
}
字符串转数组
PHP数组转字符串 implode()
$vegetables[0] = "corn";
$vegetables[1] = "broccoli";
$vegetables[2] = "zucchini";
$text=implode(",", $vegetables);
echo $text;
?>
运行结果
corn,broccoli,zucchini
2 PHP字符串转数组 explode()
$text="corn, broccoli, zucchini";
$vegetables=explode(", ", $text);
print_r($vegetables);
?>
运行结果:
Array
(
[0] =>corn
[1] =>broccoli
[2] =>zucchini
)
例题:
/*
截断字符串 utf-8格式处理方式,汉字2长度,英文1长度
$string,要处理字符串
$start,起始位置
$length,长度
$replace,截断后要替换的字符串 eg. "..."
基于 arr_split_zh 方法
*/
function my_substr($string,$start,$length,$replace){
$testlist = arr_split_zh($string);
$listcount=0;
for($i=0;$i
if(ord($testlist[$i])>127){
$listcount=$listcount+2;
}else{
$listcount=$listcount+1;
}
}
if($listcount>$start){
$str=null;
$flag=0;
$len=$start+$length;
for($i=0;$i
if($flag>=$len){break;}
if($flag>=$start){
if(ord($testlist[$i])>127){
$str.=$testlist[$i];
$flag=$flag+2;
}else{
$str.=$testlist[$i];
$flag=$flag+1;
}
}else{
if(ord($testlist[$i])>127){
$flag=$flag+2;
}else{
$flag=$flag+1;
}
}
}
return $str.$replace;
}else{
return $string;
}
}
/*
将字符串转化为数组
utf-8格式 汉字3字节 英文1字节
返回array 数组
*/
function arr_split_zh($tempaddtext){
//$tempaddtext = iconv("UTF-8", "gb2312", $addtext);
$cind = 0;
$arr_cont=array();
for($i=0;$i
{
if(strlen(substr($tempaddtext,$cind,1)) > 0){
if(ord(substr($tempaddtext,$cind,1)) < 0xA1 ){ //如果为英文则取1个字节
array_push($arr_cont,substr($tempaddtext,$cind,1));
$cind++;
}else{
array_push($arr_cont,substr($tempaddtext,$cind,3));
$cind+=3;
}
}
}
return $arr_cont;
}