PHPプログラムを作成して文字列の中の中国語の文字の個数の実例の分かち合いを検査します

2087 ワード

文字列に含まれる文字数を計算する必要がある場合があります.純粋な英語文字列の場合、文字数は文字列の長さに等しく、strlen関数で取得できますが、文字列に中国語が含まれている場合はどうすればいいですか?mb_strlenは実現できますが、不幸にも拡張を装っていないので、自分で実現しましょう.
phpには一般的に必須の拡張があり、mb_を使用することができます.strlenは文字列の文字数を取得します.一般的には次のように使用されます.

$len = mb_strlen("       ","utf-8");

文字列の長さ:7.
mb拡張が入っていなかったら?自分で叶えましょう.
まず、文字列は文字からなるが、文字はバイトで表され、各英語文字は1バイトであり、1つのasciiコードに対応し、英語文字のasciiコードは128未満、すなわち16進数の0 x 80であることを理解する.1バイトのasciiコードが127を超えると、現在のバイトは完全な文字ではないことを示す.
たとえば

$str = "       ";

の$str{0}は最初のバイトを取得できます.それは何ですか.

php > $str = "       ";
php > echo $str{0};
�

文字化けして、それはただ

     
 
       
文字のバイトの1つ、つまり、

     
 

この文字は1バイト以上で構成されています.このようにしてみましょう.

php > echo $str{0}.$str{1}.$str{2};

3バイトをつなぎ合わせて出力すると、完全な

     
 

.
ここではなぜ2つや4つではなく3バイトなのでしょうか.これは文字列の符号化に依存し、ここでコンソールのデフォルトはutf 8符号化であり、PHPでは1つのutf 8文字が3バイトで表現され、gbk符号化であれば2バイトになる.符号化とバイトの関係については、この話題が大きく、1編では言いきれないので、この文章を参考にしてください.文字符号化ノート:ascii、unicode、utf 8.
これを知って、私たちは自分で文字数検査の関数を書くことができます.大体の流れは以下の通りです.
1.forループバイト2.バイトコードが>=0 x 80かどうかを判断し、そうであればNバイトスキップ
gbkまたはutf 8文字列の長さを判断できる簡単な関数を書きました.参考までに:

= 0x80) {
      $i = $i + $step - 1;//     1,  for      $i++
    }
  }
  return $count;
}

echo mbstrlen(iconv("utf-8","gbk","       "),"gbk");
echo mbstrlen("       ");