[转帖]PHP字符串截取不乱码

2012 年 12 月 18 日4530

楼主

发贴心情

[转帖]PHP字符串截取不乱码

在一个Web系统的开发周期中,我们遇到最多的就是怎么样处理内容的显示,简单来说就是处理字符串。那么,其中最好容易处理但是也最容易有问题的就是字符串的截取!

在PHP里面有一个substr(var1,var2[,var3])这样一个函数,这个是一个字符串截取函数!

var1:一个字符串

var2:起始位

var3:大小(长度)

解释:在var1中截取从var2开始大小为var3的这么一个字符串。其中,var3要以省略,意思是截取从var2开始的到这个字符串结束的所以字符串。

很好用的一个函数,但是,美中不足的是这个函数只能处理单字符的字符串,换而言之就是不能处理汉字。因为大家在使用函数在截取有阿拉伯字母(abcde..)和汉字的时候会出现乱码,这个时候,我们就会纠结,到底怎么样处理才会让这个函数截取的字符串不乱码。()

其实,在PHP里面是提供了这样一个函数,但是,大家选择性将他遗忘了。

iconv_substr(var1,var2,var3,var4)在PHP里面存在以iconv_这样的函数有许多,那么这个函数与上面的substr的函数就只多一个var4

var1:同上

var2:同上

var3:同上

var4:编码(gbk,utf-8)

在说这个函数的用法前我需要给大家说明的是,在PHP里面的,字节是字符串的单位也就是说我们在截取字符串的时候,是按字节来处理的。那么,有必要提一下,汉字在PHP里面他要占2个字符。那么,问题,就出现了,substr在截取字符串的时候,他把字符串中的每一个字符串都按一个字符来处理,那么,在遇到奇数个的字符串,偶数的大小(长度)或偶数个的字符串,奇数的大小(长度)。在这样了情况下,就会产生乱码。比如:

这个时候乱码就产生了,反之,我们PHP语言的开发人员也想到了这个问题,就封装了一系列的iconv_开始的函数,这下,大家不难想象,iconv_substr这个函数的作用了。

解释:iconv_substr通过第4个参数将字符串转换成按个数为单位,这个样子,就不会分单字节字符和双字节字符。那么,这个函数在使用的时候是按个数处理,如下:

其结果为:中

就这个样子就解决了字符串在截取的时候产生的乱码,但是,美中不足的是,该函数必须要知道Web系统的编码,其移植性不强。请向下看:

functioncutStr($str,$len,$tail="")
{
$length=strlen($str);
$lentail=strlen($tail);
$result="";
if($length>$len)
{
$len=$len-$lentail;
for($i=0;$i<$len;$i++)
{
if(ord($str[$i])<127)
{
$result.=$str[$i];
}else{
$result.=$str[$i];
++$i;
$result.=$str[$i];
}
}
$result=strlen($result)>$len?substr($result,0,-2).$tail:$result.$tail;
}else{
$result=$str;
}
return$result;
}

解释一下,这个函数的重点在于ord这个函数的使用,ord返回指定字符的ASCLL值当其值大于了127就是双字节字符串。

其中,也用到了我们字符串的“畸形”取值的方法,在上面我们也提到过就是,将字符串看成是一个数组,并且,当时,我说过只征对单字节字符,为什么在这里我们会使用这个取值,大家,想一下,在看一下,代码不难明白为什么($result.=$str[$i];++$i;$result.=$str[$i];).

注:本文只是在探讨字符串的截取及怎么截取让其产生到我们想要的结果。时间有限,可能有些地方用户不档,请大家原谅,有错别字请大家多包涵。


图过不来,原文第2楼

0 0