站长资讯网
最全最丰富的资讯网站

php 字符串长度不一致怎么办

php字符串长度不一致的解决办法:1、通过mb_detect_encoding()函数查看字符串的编码方式;2、通过mb_strlen函数查看具体字符长度;3、使用正则表达式“preg_match_all('/[x{4e00}-x{9fff}]+/u', $str1, $matches);”剔除非中文字符即可。

php 字符串长度不一致怎么办

本教程操作环境:Windows10系统、PHP8.1版、DELL G3电脑

php 字符串长度不一致怎么办?

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

问题:

php 字符串长度不一致怎么办

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

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

<?php header("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

php 字符串长度不一致怎么办

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

<?php header("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>"; ?>
登录后复制

输出结果如下:

php 字符串长度不一致怎么办

发现字符串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]);
登录后复制

最终代码如下

<?php header("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 "不等";    }  }   ?>
登录后复制

运行结果
php 字符串长度不一致怎么办


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

php 字符串长度不一致怎么办

嗯 就是多的那两个字符

推荐学习:《PHP视频教程》

赞(0)
分享到: 更多 (0)