php截取中文字符串时乱码问题的解决方法

发布时间:2019-09-05编辑:脚本学堂
有关php截取中文字符串时乱码问题的处理方法,php字符串截取时遇到中文乱码如何解决,这里提供几个方法供大家参考。

php编程中截取字符中时,可以利用php内置方法mb_substr截取中文,确何不出现乱码问题。

1、GBK编码字符串截取
 

复制代码 代码示例:
$str = '我是谁';  //gbk编码的字符串
echo mb_substr($str, 0, 1, 'gbk'); //输出 我
mb_substr方法比substr多一个参数,用来指定字符串编码。

2、utf-8编码字符串截取
 

复制代码 代码示例:
$str = '我abc是谁';  //utf-8编码的字符串
echo mb_substr($str, 0, 2, 'utf-8'); //输出 我a
 

中英混合也完全没有问题。

注意:
1、php文件的编码与网页显示时的编码。
2、使用mb_substr方法要知晓字符串的编码,否则需要判断,mbstring库还提供了mb_check_encoding来检验字符串编码,但还不完善。

第二,php截取中文字符串问题的解决方法。

以下代码试用于GB2312编码,截取中文字符串是PHP中一个头疼的问题,解决方法是根据值是否大于等于128来判断是否是双字节字符,以避免出现乱码的情况。
但中英文混合、特殊符号等问题总是存在的情况。

程序说明:
1、len 参数以中文字符为标准,1len等于2个英文字符,为了形式上好看些
2、如果将magic参数设为false,则中文和英文同等看待,取绝对的字符数
3、特别适用于用htmlspecialchars()进行过编码的字符串
4能正确处理GB2312中实体字符模式(??)

代码: 
 

复制代码 代码示例:

function FSubstr($title,$start,$len="",$magic=true) 
{
$length = 0;
if($len == "") $len = strlen($title);
// www.jb200.com
//判断起始为不正确位置
if($start > 0)
{
  $cnum = 0;
  for($i=0;$i<$start;$i++)
  {
   if(ord(substr($title,$i,1)) >= 128) $cnum ++;
  }
  if($cnum%2 != 0) $start--;

  unset($cnum);
}

if(strlen($title)<=$len) return substr($title,$start,$len);

$alen   = 0;
$blen = 0;

$realnum = 0;

for($i=$start;$i<strlen($title);$i++)
{
  $ctype = 0;
  $cstep = 0;
  $cur = substr($title,$i,1);
  if($cur == "&")
  {
   if(substr($title,$i,4) == "<")
   {
    $cstep = 4;
    $length += 4;
    $i += 3;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,4) == ">")
   {
    $cstep = 4;
    $length += 4;
    $i += 3;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,5) == "&")
   {
    $cstep = 5;
    $length += 5;
    $i += 4;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,6) == """)
   {
    $cstep = 6;
    $length += 6;
    $i += 5;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(substr($title,$i,6) == "'")
   {
    $cstep = 6;
    $length += 6;
    $i += 5;
    $realnum ++;
    if($magic)
    {
     $alen ++;
    }
   }
   else if(preg_match("/&#(d+);/i",substr($title,$i,8),$match))
   {
    $cstep = strlen($match[0]);
    $length += strlen($match[0]);
    $i += strlen($match[0])-1;
    $realnum ++;
    if($magic)
    {
     $blen ++;
     $ctype = 1;
    }
   }
  }else{
   if(ord($cur)>=128)
   {
    $cstep = 2;
    $length += 2;
    $i += 1;
    $realnum ++;
    if($magic)
    {
     $blen ++;
     $ctype = 1;
    }
   }else{
    $cstep = 1;
    $length +=1;
    $realnum ++;
    if($magic)
    {
     $alen++;
    }
   }
  }

  if($magic)
  {
   if(($blen*2+$alen) == ($len*2)) break;
   if(($blen*2+$alen) == ($len*2+1))
   {
    if($ctype == 1)
    {
     $length -= $cstep;
     break;
    }else{
     break;
    }
   }
  }else{
   if($realnum == $len) break;
  }
}

unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);

return substr($title,$start,$length);
}

附,php中文字符串截取函数。
代码:
 

复制代码 代码示例:
function cnSubStr($string,$sublen)
{
    if($sublen>=strlen($string))
    {
        return $string;
    }
    $s="";
    for($i=0;$i<$sublen;$i++)
    {
        if(ord($string{$i})>127) 
        {
            $s.=$string{$i}.$string{++$i};
            continue;
        }else{
            $s.=$string{$i};
            continue;
        } 
    }
    return $s;
}// End Function cnSubStr($string,$sublen)
/////////// Use like this :
echo "<p>__________________________<p>";
$string="242432反对感是456犯得上广泛大使馆地方7890";
$sublen=strlen($string);
$len=20;
echo $string."<p>";
echo "总长为:".($sublen+1)."<p>";
echo "截取数:".$len."<p>";
for($i=1;$i<=$sublen+1;$i++){
    if($i>$len){
        echo $i."<b> →</b> ".cnSubStr($string,$i)."…<br>";
        continue;
    }
    echo $i."<b> →</b> ".cnSubStr($string,$i)."<br>";
}