• 技术文章 >后端开发 >PHP问题

    解决php字符串一样但长度不等的问题

    藏色散人藏色散人2020-07-18 09:13:30原创666

    解决php字符串长度不等的方法:首先通过“mb_detect_encoding()”函数查看两个字符串的编码方式;然后查看具体字符长度;最后剔除非中文字符即可。

    问题:

    这里写图片描述

    如图所示 咋眼看去两个一样的中文字符串“后勤保障部”,但一个长度为21 一个为15。

    首先直觉可能会认为是编码方式不一样导致的,
    通过mb_detect_encoding()函数查看两个字符串的编码方式 代码如下

    <?phpheader("Content-Type: text/html;charset=utf-8"); 
    
    $data[0]=$str1="后勤保障部‍";$data[1]=$str2="后勤保障部";
    var_dump($data);//查看编码方式$encode1 = mb_detect_encoding($str1,  array("ASCII","UTF-8","GB2312","GBK","BIG5"));$encode2 = mb_detect_encoding($str2,  array("ASCII","UTF-8","GB2312","GBK","BIG5"));echo "str1='".$str1."'"."&emsp;编码:".$encode1."</br>";echo "str2='".$str2."'"."&emsp;编码:".$encode2."</br>";?>

    但输出结果都是UTF-8

    这里写图片描述

    那么是什么原因呢 ,我们在输出看下具体字符长度

    <?phpheader("Content-Type: text/html;charset=utf-8"); 
    
    $data[0]=$str1="后勤保障部‍";$data[1]=$str2="后勤保障部";
    var_dump($data);//查看编码方式$encode1 = mb_detect_encoding($str1,  array("ASCII","UTF-8","GB2312","GBK","BIG5"));$encode2 = mb_detect_encoding($str2,  array("ASCII","UTF-8","GB2312","GBK","BIG5"));//当mb_strlen的内码选择为UTF-8的时候,则会将中文字符当成一个字符//strlen,得到的是字符串所占的字节数echo "str1='".$str1."'".":&emsp;字符长度:".mb_strlen($str1).":&emsp;字节长度:".strlen($str1)."&emsp;编码:".$encode1."</br>";echo "str2='".$str2."'".":&emsp;字符长度:".mb_strlen($str2).":&emsp;字节长度:".strlen($str2)."&emsp;编码:".$encode2."</br>";?>

    输出结果如下:

    这里写图片描述

    发现字符串str1有7个中文字符,但实际只显示了5个,也就是“后勤保障部”

    通过截取str1最后两个字符查看

    //截取str1后面两个未显示字符$res=mb_substr($str1, 5,2);echo "最后两字符:".$res."</br>";echo mb_strlen($res);

    无法echo显示,但确实占有两个字符

    如果实际要求这看上去一样的字符串就相等的话,需要进行处理,处理就是剔除非中文字符:

    //剔除str1字串中未显示的字符(非中文字符)preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str1, $matches);$str1 = join('', $matches[0]);

    最终代码如下

    <?phpheader("Content-Type: text/html;charset=utf-8"); 
    
    $data[0]=$str1="后勤保障部‍";$data[1]=$str2="后勤保障部";
    var_dump($data);//查看编码方式$encode1 = mb_detect_encoding($str1,  array("ASCII","UTF-8","GB2312","GBK","BIG5"));$encode2 = mb_detect_encoding($str2,  array("ASCII","UTF-8","GB2312","GBK","BIG5"));//当mb_strlen的内码选择为UTF-8的时候,则会将中文字符当成一个字符//strlen,得到的是字符串所占的字节数echo "str1='".$str1."'".":&emsp;字符长度:".mb_strlen($str1).":&emsp;字节长度:".strlen($str1)."&emsp;编码:".$encode1."</br>";echo "str2='".$str2."'".":&emsp;字符长度:".mb_strlen($str2).":&emsp;字节长度:".strlen($str2)."&emsp;编码:".$encode2."</br>";//截取str1后面两个未显示字符echo "</br>------------------截取str1后面两个未显示字符---------------------</br>";$res=mb_substr($str1, 5,2);echo "str1最后两字符:&emsp;".$res."</br>";echo "str1长度:&emsp;".mb_strlen($res)."</br>";//比较echo "</br>--------------------------相等比较----------------------------------</br>";echo "str1 与 str2比较:&emsp;";echo strcomp($str1,$str2)."</br>";echo "str2 与 str2比较:&emsp;";echo strcomp($str2,$str2)."</br>";//剔除str1字串中非中文preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str1, $matches);$str1 = join('', $matches[0]);echo "</br>---------------------剔除str1字串中非中文后----------------------</br>";echo "str1='".$str1."'".":&emsp;字符长度:".mb_strlen($str1).":&emsp;字节长度:".strlen($str1)."&emsp;编码:".$encode1."</br>";echo "str1 与 str2比较:&emsp;";echo strcomp($str1,$str2)."</br>";function strcomp($str1,$str2){ 
      if($str1 == $str2){ 
        return "相等"; 
      }else{ 
        return "不等"; 
      } 
    } 
    
    ?>

    运行结果
    这里写图片描述


    注:
    将21字节的str1复制到phpmyadmin的sql输入框,显示如下

    这里写图片描述

    嗯 就是多的那两个字符

    更多相关知识,请访问PHP中文网

    以上就是解决php字符串一样但长度不等的问题的详细内容,更多请关注php中文网其它相关文章!

    声明:本文原创发布php中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php
    上一篇:评价一台计算机的性能主要通过哪几个方面 下一篇:linux php如何安装mysql数据库
    大前端线上培训班

    相关文章推荐

    • php字符串怎么不区分大小写的查找子串?• php怎么将16进制转为字符串?• php字符串怎么去掉最后一个字符?• php中数组怎么转成字符串?

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网