首頁  >  文章  >  後端開發  >  php 字串長度不一致怎麼辦

php 字串長度不一致怎麼辦

藏色散人
藏色散人原創
2023-02-07 09:58:293888瀏覽

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=&#39;".$str1."&#39;"."&emsp;编码:".$encode1."</br>";
echo "str2=&#39;".$str2."&#39;"."&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=&#39;".$str1."&#39;".":&emsp;字符长度:".mb_strlen($str1).":&emsp;字节长度:".strlen($str1)."&emsp;编码:".$encode1."</br>";
echo "str2=&#39;".$str2."&#39;".":&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(&#39;/[\x{4e00}-\x{9fff}]+/u&#39;, $str1, $matches);
$str1 = join(&#39;&#39;, $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=&#39;".$str1."&#39;".":&emsp;字符长度:".mb_strlen($str1).":&emsp;字节长度:".strlen($str1)."&emsp;编码:".$encode1."</br>";
echo "str2=&#39;".$str2."&#39;".":&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(&#39;/[\x{4e00}-\x{9fff}]+/u&#39;, $str1, $matches);
$str1 = join(&#39;&#39;, $matches[0]);

echo "</br>---------------------剔除str1字串中非中文后----------------------</br>";
echo "str1=&#39;".$str1."&#39;".":&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影片教學

#

以上是php 字串長度不一致怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn