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

问题:

php 中字符串一样但长度不等的问题_第1张图片

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

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


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."'"." 编码:".$encode1."
"
; echo "str2='".$str2."'"." 编码:".$encode2."
"
; ?>

但输出结果都是UTF-8

php 中字符串一样但长度不等的问题_第2张图片

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


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."'".": 字符长度:".mb_strlen($str1).": 字节长度:".strlen($str1)." 编码:".$encode1."
"
; echo "str2='".$str2."'".": 字符长度:".mb_strlen($str2).": 字节长度:".strlen($str2)." 编码:".$encode2."
"
; ?>

输出结果如下:

php 中字符串一样但长度不等的问题_第3张图片

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

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

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

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

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

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

最终代码如下


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."'".": 字符长度:".mb_strlen($str1).": 字节长度:".strlen($str1)." 编码:".$encode1."
"
; echo "str2='".$str2."'".": 字符长度:".mb_strlen($str2).": 字节长度:".strlen($str2)." 编码:".$encode2."
"
; //截取str1后面两个未显示字符 echo "
------------------截取str1后面两个未显示字符---------------------
"
; $res=mb_substr($str1, 5,2); echo "str1最后两字符: ".$res."
"
; echo "str1长度: ".mb_strlen($res)."
"
; //比较 echo "
--------------------------相等比较----------------------------------
"
; echo "str1 与 str2比较: "; echo strcomp($str1,$str2)."
"
; echo "str2 与 str2比较: "; echo strcomp($str2,$str2)."
"
; //剔除str1字串中非中文 preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str1, $matches); $str1 = join('', $matches[0]); echo "
---------------------剔除str1字串中非中文后----------------------
"
; echo "str1='".$str1."'".": 字符长度:".mb_strlen($str1).": 字节长度:".strlen($str1)." 编码:".$encode1."
"
; echo "str1 与 str2比较: "; echo strcomp($str1,$str2)."
"
; function strcomp($str1,$str2){ if($str1 == $str2){ return "相等"; }else{ return "不等"; } } ?>

运行结果
php 中字符串一样但长度不等的问题_第4张图片


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

php 中字符串一样但长度不等的问题_第5张图片

嗯 就是多的那两个字符

你可能感兴趣的:(mysql,php)