ホームページ  >  記事  >  バックエンド開発  >  PHP は文字列の長さを決定します strlen() および mb_strlen() 関数

PHP は文字列の長さを決定します strlen() および mb_strlen() 関数

巴扎黑
巴扎黑オリジナル
2016-11-09 14:38:491512ブラウズ

strlen()

PHP strlen() 関数

定義と使用法

strlen() 関数は文字列の長さを返します。

構文

strlen(string)

パラメータ: 文字列
説明: 必須。チェックする文字列を指定します。

コードは次のとおりです

<?php 
$str=‘中文a字1符‘; 
echo strlen($str); 
echo ‘<br />‘; 
echo mb_strlen($str,‘UTF8‘); 
//输出结果 
//14 
//6 
?>

結果分析: strlen を計算するとき、UTF8 の漢字は 3 つの長さとして扱われるため、「中国語の 1 文字 1 文字」の長さは 3*4+2=14 になります
mb_strlen を計算する場合, select 内部コードがUTF8の場合、中国語の文字は長さ1として計算されるので、「中国語の文字1文字」の長さは6になります


mb_strlen()関数

なお、mb_strlenはPHP のコア関数ではないため、使用する前に、php_mbstring.dll が php.ini にロードされていることを確認する必要があります。つまり、「extension=php_mbstring.dll」という行が存在し、コメントアウトされていないことを確認してください。そうしないと問題が発生します。未定義の関数が発生します。

コードは次のとおりです

<?php 
$str=‘中文a字1符‘; 
//计算如下 
echo (strlen($str) + mb_strlen($str,‘UTF8‘)) / 2; 
echo 
//输出结果 
//10 
?>

「中国語1文字1文字」のstrlen($str)値は14、mb_strlen($str)値は6です。すると、「中国語」のプレースホルダーは次のように計算できます。 1文字1文字"は10です。

2つの違いを説明します

コードは次のとおりです

<?php
//测试时文件的编码方式要是UTF8
$str=&#39;中文a字1符&#39;;
echo strlen($str).&#39;<br>&#39;;//14
echo mb_strlen($str,&#39;utf8&#39;).&#39;<br>&#39;;//6
echo mb_strlen($str,&#39;gbk&#39;).&#39;<br>&#39;;//8
echo mb_strlen($str,&#39;gb2312&#39;).&#39;<br>&#39;;//10
?>


結果分析: strlenを計算するとき、UTF8の漢字は3つの長さとして扱われるため、 「中国語の文字 1 文字」の長さは 3*4+2=14 です。 mb_strlen

を計算する際、内部コードが UTF8 を選択している場合、中国語の文字は 1 文字として計算されますので、「」の長さは中国語 a 文字 1 文字」は 6.

上記の関数は中国語と英語の混合の問題を簡単に解決できますが、実際には使用できません。他のより良い解決策を友達に紹介しましょう


中国語と英語の混合文字列の長さを取得するための PHP の実装コードは次のとおりです。1 中国語 = 1 桁、2 英語 = 1 桁ですが、自分で変更できます

コードは次のとおりです

/*** PHP获取字符串中英文混合长度 * @param $str string 字符串* @param $$charset string 编码* @return 返回长度,1中文=1位,2英文=1位*/function strLength($str,$charset=&#39;utf-8&#39;){if($charset==&#39;utf-8&#39;) $str = iconv(&#39;utf-8&#39;,&#39;gb2312&#39;,$str);$num = strlen($str);$cnNum = 0;for($i=0;$i<$num;$i++){if(ord(substr($str,$i+1,1))>127){$cnNum++;$i++;}}$enNum = $num-($cnNum*2);$number = ($enNum/2)+$cnNum;return ceil($number);}
//测试输出长度都为15$str1 = &#39;测试测试测试测试测试测试测试测&#39;;$str2 = &#39;aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&#39;;$str3 = &#39;aa测试aa测试aa测试aa测试aaaaaa&#39;;echo strLength($str1,&#39;gb2312&#39;);echo strLength($str2,&#39;gb2312&#39;);echo strLength($str3,&#39;gb2312&#39;);

Intercept stringinfunction

utf8エンコード、UTF8では、1つの漢字が3バイトを占有します。コードは次のとおりです。は以下の通りです

function msubstr($str, $start, $len) {
 $tmpstr = "";
 $strlen = $start + $len;
 for($i = 0; $i < $strlen; $i++){
  if(ord(substr($str, $i, 1)) > 127){
   $tmpstr.=substr($str, $i, 3);
   $i+=2;
  }else
   $tmpstr.= substr($str, $i, 1);
 }
 return $tmpstr;
}
echo msubstr("一二三天下致公english",0,10);

互換性のある良い関数

のコードは以下の通りです

<?php
function msubstr($str, $start, $len) {   //ȡ
   $tmpstr = "";
   $strlen = $start + $len;
   if(preg_match(&#39;/[/d/s]{2,}/&#39;,$str)){$strlen=$strlen-2;}
   for($i = 0; $i < $strlen; $i++) {
       if(ord(substr($str, $i, 1)) > 0xa0) {
           $tmpstr .= substr($str, $i, 2);
           $i++;
       } else
           $tmpstr .= substr($str, $i, 1);
     }
   return $tmpstr;
 }
  
?>


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。