php中使用substr截取字符串乱码的解决方法

  介绍

这篇文章主要介绍php中使用substr截取字符串乱码的解决方法,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

php字符串的子串截取字符串乱码的解决办法:1、使用mbstring扩展库的“mb_substr()“截取;2、使用ecshop里面的截取utf - 8编码下字符串的函数。

在php程序开发中,经常会执行字符串的截取操作,比如输出信息列表时,标题不宜过长,打印文章摘要时,也要执行一系列的字符串截取操作。遇到这些需求时,我们经常会想到使用substr()方法来实现,substr()对全英文字符串的截取是比较适合的。

但字符串只要出现中文字符,就有可能导致php字符串的子串中文乱码,因为中文utf - 8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位数不准确,substr()硬生生地将一个中文字符“锯成两半,造成断开的字符会把其后的. .拉过来一起做一个字,所以出现了PHP字符串的子串中文乱码。

<强> substr——取得部份字符串

语法:字符串的子串(字符串的字符串,整数开始[int长度])

说明:

substr()传回字符串的一部份字符串,由参数开始和长度指定。

如果开始是正数,传回的字符串将会从字符串的开始第个字元开始。

<强>例子:

& lt; PHP ?   $ rest =, substr  (“abcdef",, 1),,//, returns “bcdef"   $ rest =, substr  (“abcdef",, 1,, 3);,//, returns “bcd"   ?在

如果开始是负数,传回的字符串将会从字符串结尾的开始第个字开始。

<强>例子:

& lt; php ?   $ rest =, substr  (“abcdef",, 1),,//, returns “f"   $ rest =, substr  (2)“abcdef"也,,//,returns “ef"   $ rest =, substr  (“abcdef",, 3,, 1),,//, returns “d"   ?在

如果有给予参数长度而且是正数时,传回的字符串将会从开始传回长度个字元。
如果有给予参数长度而且是负数时,传回的字符串将会结束于字符串结尾的长度第个字元。

<强>例子:

& lt; php ?   $ rest =, substr  (“abcdef",, 1, 1),,//, returns “bcde"   ?在

对于英文没有问题,我们测试一个中文

& lt; php ?   $ rest =, substr (“中国人“,,1,1),,//,returns “fdsafsda",就是乱码了   ?在

这种截取字符的结果,肯定不是我们想要的结果,这种出现PHP字符串的子串中文乱码的情况,可能会导致程序无法正常运行。解决办法主要有两种:

<强>一、使用mbstring扩展库的mb_substr()截取就不会出现乱码了。

可以用mb_substr ()/mb_strcut()这个函数,mb_substr ()/mb_strcut()的用法与substr()相似,只是在mb_substr ()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开php_mbstring.dll,需要在PHP . ini中在把php_mbstring。dll打开。

& lt; php ?   echo 才能;mb_substr (“php中文字符encode", 0, 4,“utf-8");   ?在

如果未指定最后一个编码参数,会是三个字节为一个中文,这就是UTF - 8编码的特点,若加上UTF - 8字符集说明,所以,是以一个字为单位来截取的。

使用的时候要注意php文件的编码,和网页显示时的编码。使用这个mb_substr方法要事先知道字符串的编码,如果不知道编码,就需要判断,mbstring库还提供了mb_check_encoding来检验字符串编码,但还不完善。

php自带几种字符串截取函数,其中常用到的就是substr和mb_substr。前者在处理中文时,GBK为2个长度单位,UTF为3个长度单位,后者指定编码后,一个中文即为1个长度单位。

的子串有时会截1/3个中文或半个中文,会显示乱码,相对来说mb_substr更适合我们使用。不过有时候mb_substr就显得不那么好用了。例如我要显示一个小图片的简要信息,5个中文正好,超过5个就截取前4再加上“…”,这样处理中文是没问题了,可是处理英文或数字,这样截取就太短了。

<强>二,自己书写截取函数,但效率不如用mbstring扩展库来得高。下面是ecshop里面的截取UTF - 8编码下字符串的函数。

function  sub_str (str美元,美元length =,,, append 美元;=,真的)   {   美元才能str =,修剪(str);   时间=美元才能strlength  strlen (str);   if 才能;(length 美元;==,| |,length 美元;祝辞=,strlength美元)   {才能   ,,,return  str美元;,//截取长度等于或大于等于本字符串的长度,返回字符串本身   ,,}   elseif 才能;(length 美元;& lt;,),//如果截取长度为负数   {才能   ,,,length 美元;=,strlength 美元;+,长度;美元//那么截取长度就等于字符串长度减去截取长度   ,,,if  (length 美元;& lt;,)   ,,,{   ,,,,,length 美元;=,strlength美元;//如果截取长度的绝对值大于字符串本身长度,则截取长度取字符串本身的长度   ,,,}   ,,}   if 才能;(function_exists (& # 39; mb_substr& # 39;))   {才能   ,,,newstr 美元;=,mb_substr (str美元,,,,长度,美元,EC_CHARSET);   ,,}   elseif 才能;(function_exists (& # 39; iconv_substr& # 39;))   {才能   ,,,newstr 美元;=,iconv_substr (str美元,,,,长度,美元,EC_CHARSET);   ,,}   其他的才能   {才能   ,,,//newstr 美元;=,trim_right (substr (str美元,,,,长度)美元);   ,,,newstr 美元;=,substr (str美元,,,,美元长度);   ,,}   if 才能;(append 美元;,,,str 美元;!=,newstr美元)   {才能   ,,,newstr 美元。=,& # 39;……& # 39;;   ,,}   return 才能;newstr美元;   }

php中使用substr截取字符串乱码的解决方法