strlen() 関数と mb_strlen() 関数
PHP では、関数 strlen() は文字列の長さを返します。関数のプロトタイプは次のとおりです。
int strlen(string string_input);
パラメーター string_input は、処理される文字列です。
strlen() 関数は、文字列が占めるバイトの長さを返します。英語の文字、数字、およびさまざまな記号はすべて 1 バイトを占め、その長さはすべて 1 です。正午の文字は 2 バイトを占めるため、正午の文字の長さは 2 です。たとえば、
<?php echo strlen("www.php.cn"); echo strlen("PHP中文网"); ?>
"echo strlen("www.php.cn");" 実行結果は次のようになります: 15
"echo strlen("PHP Chinese Network");" 実行結果は次のようになります: 15
質問ですが、漢字は2バイトを占めませんか? 「Sanzhi Development Network」には明らかに 5 つの漢字が含まれていますが、結果が 15 文字になるのはなぜでしょうか。
その理由は、strlen() を計算するときに、UTF-8 の漢字の場合、長さが 3 であるものとして扱われるからです。中国語と英語が混在している場合、文字列の長さを正確に計算するにはどうすればよいでしょうか?ここで、別の関数 mb_strlen() を導入する必要があります。 mb_strlen() 関数の使用法は、文字セット エンコーディングを指定する追加パラメーターがあることを除いて、strlen() とほぼ同じです。関数のプロトタイプは次のとおりです。
int mb_strlen(string string_input, string encode);
PHP の組み込み文字列長関数 strlen は、中国語の文字列を正しく処理できません。文字列が占有するバイト数のみを取得します。 GB2312 中国語エンコードの場合、strlen によって取得される値は中国語の文字数の 2 倍ですが、UTF-8 エンコードされた中国語の場合、その差は 3 倍になります (UTF-8 エンコードでは、1 つの中国語文字は 3 バイトを占めます)。 したがって、次のコードは中国語の文字列の長さを正確に計算できます:
<?php $str = "三知sunchis开发网"; echo strlen($str)."<br>"; //结果:22 echo mb_strlen($str,"UTF8")."<br>"; //结果:12 $strlen = (strlen($str)+mb_strlen($str,"UTF8"))/2; echo $strlen; //结果:17 ?>
原理分析:
strlen() 計算するとき、UTF-8 で扱われる中国語の文字の長さは 3 なので、「三知sunchisDevelopmentNetwork」の長さは5×3+7×1=22 です
mb_strlen を計算する際、内部コードが UTF8 に選択されている場合、漢字の長さは 1 として計算されるため、「Sanzhi Sunchis Development Network」の長さは5×1+ 7×1=12
残りは純粋な数学の問題なので、ここでは詳しく説明しません...
注: mb_strlen($str,'UTF-8') の場合、 2 番目のパラメータを省略すると、PHP の内部エンコーディングが使用されます。内部エンコーディングは、mb_internal_encoding() 関数を通じて取得できます。 mb_strlen は PHP のコア関数ではないことに注意してください。使用する前に、php_mbstring.dll が php.ini にロードされていること、つまり「extension=php_mbstring.dll」という行が存在することを確認する必要があります。コメントアウトされていない場合は、関数の問題が未定義になります。
PHP 文字列の長さの計算 - strlen() 関数の使用方法の詳細については、PHP 中国語 Web サイトの関連記事に注目してください。