同じPHP文字列でも長さが異なる問題を解決する

藏色散人
リリース: 2023-03-02 16:52:02
オリジナル
2875 人が閲覧しました

PHP 文字列の長さの不一致を解決する方法: 最初に「mb_detect_encoding()」関数を使用して 2 つの文字列のエンコード方法を確認し、次に特定の文字長を確認し、最後に中国語以外の文字を削除します。

同じPHP文字列でも長さが異なる問題を解決する

質問:

同じPHP文字列でも長さが異なる問題を解決する

写真に示すように、2 つあります。一見すると同じ中国語の文字列「物流支援部」ですが、一方の長さは 21 で、もう一方は長さ 15 です。

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

<?phpheader("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文字列でも長さが異なる問題を解決する

それでは、何が原因でしょうか?出力内の特定の文字長を確認してみましょう

<?phpheader("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]);
ログイン後にコピー

最終的なコードは次のとおりです

<?phpheader("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 中国語 Web サイト をご覧ください。

以上が同じPHP文字列でも長さが異なる問題を解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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