本文介绍了使用php substr()拦截字符串时如何处理乱码,其中涉及到php substr()方法的一些知识点。和感兴趣的朋友一起学习吧。
在PHP程序开发中,经常会进行字符串截取。比如输出信息列表时,标题不能太长,打印文章摘要时,也要进行一系列的字符串截取操作。当我们满足这些需求时,往往会想到使用substr()方法,substr()更适合拦截所有英文字符串。
但只要字符串中出现汉字,就可能导致PHP substr的中文乱码。因为中文UTF-8编码,每个汉字占3个字节,而GB2312占2个字节,英文占1个字节,所以截取的位数不准确。Subsr()强行将一个汉字“锯”成两半,导致断开的字符拉动下面的.在一起组成一个单词,所以PHP substr出现中文乱码。
substr --- 取得部份字符串
语法:string substr(字符串string,int start [,int length])
描述:
Substr()返回字符串的一部分,由参数start和length指定。
如果start是正数,则返回的字符串将从字符串的起始字符开始。
Example :
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$rest=substr ('abcdef ',1);//返回“bcdef”
$rest=substr ('abcdef ',1,3);//返回“bcd”
?
如果start为负数,返回的字符串将以字符串末尾的起始单词开始。
Example :
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$rest=substr ('abcdef ',-1);//返回“f”
$rest=substr ('abcdef ',-2);//返回“ef”
$rest=substr ('abcdef ',-3,1);//返回“d”
?
如果给定了参数length并且它是正数,则返回的字符串将从开始处返回长度字符。
如果给定了参数length,并且它是负数,则返回的字符串将在字符串末尾的长度字符处结束。
Example :
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$rest=substr ('abcdef ',1,-1);//返回“bcde”
?
英语没有问题。让我们测试一个中国人。
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
$rest=substr('中国人',1,-1);//返回“fdsafsda”是乱码
?
这样截取人物的结果肯定不是我们想要的。这种中文乱码的PHP substr可能会导致程序无法正常运行。有两种主要的解决方案:
一、使用mbstring扩展库的mb_substr()截取就不会出现乱码了。
可以使用函数mb_substr()/mb_strcut()。mb_substr()/mb_strcut()的用法和substr()类似,只是在mb_substr()/mb_strcut的末尾多加了一个参数来设置字符串的编码,但是一般的服务器不会打开PHP _ mbstring.
?服务器端编程语言(Professional Hypertext Preprocessor的缩写)
Mb _ substr ('PHP汉字编码',0,4,' utf-8 ');
?
如果最后一个编码参数没有指定,三个字节就是一个中文,这是utf-8编码的特点。如果加上utf-8字符集描述,会被一个字截取。
使用时注意php文件的编码和网页的编码。使用这个mb_substr方法时,需要预先知道字符串的编码。如果不知道编码,就需要判断了。mbstring库也提供了mb_check_encoding来检查字符串的编码,但是并不完善。
PHP自带了几个字符串拦截函数,其中比较常用的是substr和mb_substr。当前者处理中文时,GBK是2个长度单位,UTF是3个长度单位。当后者指定编码时,中文是1个长度单位。
Substr有时候会截1/3中文或者半中文,会显示乱码。相对来说,mb_substr更适合我们使用。但是有时候mb_substr就没那么好用了。比如我要显示一个小图片的简要信息,五个汉字正好。如果超过五个字符,截取前四个字符并添加“…”。处理中文没问题,处理英文或者数字太短了。
二、自己书写截取函数,但效率不如用mbstring扩展库来得高。下面是ecshop里面的截取UTF-8编码下字符串的函数。
函数sub_str($str,$length=,$append=true)
{
$ str=trim($ str);
$ strlength=strlen($ str);
if($ length==| | $ length=$ strlength)
{
返回$ str//截距长度等于或大于此字符串的长度,返回字符串本身。
}
Elseif ($length) //如果截距长度为负
{
$ length=$ strlength $ length//那么截距长度等于字符串长度减去截距长度
if(长度)
{
$ length=$ strlength//如果截距长度的绝对值大于字符串本身的长度,则截距长度取字符串本身的长度。
}
}
if (function_exists('mb_substr '))
{
$newstr=mb_substr($str,$length,EC _ CHARSET);
}
else if(function _ exists(' iconv _ substr '))
{
$newstr=iconv_substr($str,$length,EC _ CHARSET);
}
其他
{
//$ newstr=trim _ right(substr($ str,$ length));
$newstr=substr($str,$ length);
}
if ($append $str!=$newstr)
{
$newstr。='.';
}
return $ newstr
}
好了,这篇文章就到这里。相信会给你带来一些东西。上面的代码也很简单。有不明白的地方请给我留言,我会尽快给你答复。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。