PHPのstrlenとmb_の詳細strlen関数の違い

1758 ワード

PHPには文字列の個数を計算する2つの関数があります.1つはstrlenで、1つはmb_です.strlen;まず、マニュアルの定義strlenstrlenを見てみましょう.文字列長int strlen(string$string)を取得して、所与の文字列stringの長さを返します.
mb_strlenint mb_strlen(string$str[,string$encoding])は、所与の文字列stringの長さを返します.encodingパラメータは文字符号化です.省略する場合は、内部文字符号化を使用します.
こう見るとmb以外はstrlenは1つの文字符号化を伝えることができるが、他に違いはないようだ.以下、例を挙げて、この2つの違いを説明する.まず例を見てみましょう.
 
  
$str=' a 1 ';   
echo strlen($str).'
';//14   
echo mb_strlen($str,'utf8').'
';//6   
echo mb_strlen($str,'gbk').'
';//8   
echo mb_strlen($str,'gb2312').'
';//10   
?>

結果分析:strlen計算では、UTF 8に対する中国語文字は3文字長であるため、「中国語a字1文字」の長さは3*4+2=14でmb_strlenの計算時に選択するイントラコードがUTF 8であれば、1つの中国語文字を長さ1として計算するので、「中国語a字1文字」の長さは6となる.
この2つの関数を使用すると、1つの中国語と英語が混在している列の占有率を計算することができます(1つの中国語文字の占有率は2で、英語文字は1です).

   echo (strlen($str) + mb_strlen($str,'UTF8')) / 2;  
 

例えば「中国語a字1文字」のstrlen($str)値は14,mb_strlen($str)値が6であれば、「中国語a字1文字」の占有率は10と算出できる.

   echo mb_internal_encoding(); 
 

PHPに内蔵された文字列長関数strlenは、中国語の文字列を正しく処理できません.文字列が占めるバイト数だけが得られます.GB 2312の中国語符号化ではstrlenが得た値は漢字個数の2倍であり、UTF-8符号化の中国語では3倍の差がある(UTF-8符号化では漢字1文字が3バイトを占める).
mb_を採用strlen関数はこの問題をよりよく解決できる.mb_strlenの使い方はstrlenと似ていますが、文字符号化を指定する2番目のオプションパラメータがあります.例えばUTF-8の文字列$str長を得るにはmb_strlen($str,'UTF-8').2番目のパラメータを省略するとPHPの内部コードが使用されます.内部符号化はmb_internal_encoding()関数が得られます.注意すべきはmb_strlenはPHPコア関数ではなく、Windowsで使用する前にphpを確保する必要がある.iniにphp_がロードされましたmbstring.dllは、「extension=php_mbstring.dll」という行が存在し、コメントされていないことを確認します.そうしないと、関数が定義されていないという問題が発生します.Linuxではこの拡張子をコンパイルする必要があります.