文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-05-14 20:17

关注

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 中字符串一样但长度不等的问题

问题:

353b961cc8683620091dd5ce9b32cd7.jpg

如图所示 咋眼看去两个一样的中文字符串“后勤保障部”,但一个长度为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

6761645046379c5e985f8c66e254dda.jpg

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

<?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>";
?>

输出结果如下:

27d1cf2e1e07cd19b8d3895d81b1e24.jpg

发现字符串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 "不等"; 
  } 
} 

?>

运行结果
f4f06f8edf48fd52687a68fe87884cc.jpg


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

91e36c733c4d7b750836cb0b217900d.jpg

嗯 就是多的那两个字符

以上就是php 字符串长度不一致怎么办的详细内容,更多请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 资料下载
  • 历年真题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯