[原创,转载请注明:[url]http://wfyang.blog.51cto.com[/url]]
现在流传的那几个字符串截取函数,一般都是对字符串进行循环判断,如果要截取的串比较长,效率就成了一个问题。
我解决的办法非常简单,还是用substr()函数,只不过在substr($str)的后面带一个chr(0),即substr($str).chr(0)
下面我说一下这种方法的原理。chr(0)代表的是ascii码表中的第一个字符"null",是一个非打印字符(有关chr()函数和ascii码的知识可以参阅PHP手册)。当substr()函数将一个全角字符截掉一半的时候,我们得到的字符串的最后一个字符实际上是被截掉的全角字符的区位码(有关中文字符编码的知识请看这里: [url]http://huggin.bokee.com/3857070.html[/url])。".chr(0)"的作用就是将那个区位码与"000"结合,这同样是一个非打印字符,于是,乱码不见了。
这样做还存在一个问题,那就是字符截取的数量并不是很精确。你用for循环对“我是1个中国人,我热爱我的祖国”这个串进行一下截取就知道了。要解决这个问题,简单一点的方法是写一个函数,在用substr()函数的时候将$length*2,这样截取的长度总量为偶数,在大多数情况下,这能保证返回的字符串长度基本符合需要。更复杂一点的方法是对截取得到的字符串的最后一个字符串进行判断,不过对中文字符串来说,这样精确的截取好象并不是很有意义,反面会降低程序的效率。
下面给出一个简单的函数实现以前验证程序,这里并没有对一些特殊情况进行判断,你可以自己加上。
<?php
//文件名:char.php
//功能:新的字符截取函数
//作者:wfyang
//日期:Mon Nov 20 10:04:08 CST 2006

//本函数截取的字符串长度单位为全角字符
function cutstr($str = '',$length = 0)
{
 $length *=2;
 if (strlen($str) <= $length)
  return $str;
 return substr($str,0,$length).chr(0).'…';
}

$str = '我是1个中国人,我热爱我的祖国!';
for ($i=1;$i<16;$i++)
{
 echo $i.':'.cutstr($str,$i).'<br/>';
}
 ?>