PHP文字列の長さが一致しない場合の対処方法

藏色散人
リリース: 2023-03-17 21:42:02
オリジナル
3882 人が閲覧しました

php の文字列長が一貫していない場合の解決策: 1. mb_detect_encoding() 関数を使用して文字列のエンコード方式を確認します; 2. mb_strlen 関数を使用して特定の文字長を確認します; 3. 正規表現 " を使用します。 preg_match_all('/ [\x{4e00}-\x{9fff}] /u', $str1, $matches);" 中国語以外の文字を削除するだけです。

PHP文字列の長さが一致しない場合の対処方法

このチュートリアルの動作環境: Windows 10 システム、PHP バージョン 8.1、DELL G3 コンピューター

php文字列の長さが矛盾していますか?

PHP で同じ文字列が長さが異なる場合の問題

質問:

PHP文字列の長さが一致しない場合の対処方法

図に示すように、一見すると同じ漢字の文字列「兵站支援部」が 2 つあります。 、ただし、1 つは長さ 21、もう 1 つは長さ 15 です。

まず、エンコード方法の違いが原因であると直感的に思われるかもしれません。
mb_detect_encoding() 関数を使用して、2 つの文字列のエンコード方法を確認します。

<?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 の最後の 2 文字をインターセプトすることにより、文字ビュー

//截取str1后面两个未显示字符
$res=mb_substr($str1, 5,2);
echo "最后两字符:".$res."</br>";
echo mb_strlen($res);
ログイン後にコピー

はエコー表示できませんが、2 文字を占有します

実際には同じである必要があるため、中国語以外の文字を削除する処理が必要です:

//剔除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文字列の長さが一致しない場合の対処方法

そうですね、余分な 2 文字です

推奨される学習: 「

PHP ビデオ チュートリアル >>

以上がPHP文字列の長さが一致しない場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート