ホームページ  >  記事  >  バックエンド開発  >  php_PHP チュートリアルの strlen、mb_strlen、substr()、mb_substr()、mb_strcut の違い

php_PHP チュートリアルの strlen、mb_strlen、substr()、mb_substr()、mb_strcut の違い

WBOY
WBOYオリジナル
2016-07-13 17:00:011178ブラウズ

この記事では、strlen、mb_strlen、substr()、mb_substr()、mb_strcut の違いと使い方を詳しく紹介しています。学習が必要な学生は参考にしてください。

mb_*の文字列分割関数の利用について:
win での設定
php_mbstring.dll 拡張機能をインストールする必要があります
php.ini で php_mbstring.dll を開く必要があります
Linux での設定はオンラインで簡単に検索できます

コードは次のとおりです コードをコピー

//テスト時のファイルのエンコード方式はUTF8である必要があります
$str='漢字a';
echo strlen($str).'
';//14
echo mb_strlen($str,'utf8').'
';//6
echo mb_strlen($str,'gbk').'
';//8
echo mb_strlen($str,'gb2312').'
';//10
?>


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

mb_strlen デフォルトのエンコーディングを渡すことができます

mb_internal_encoding() を取得しました。

これら 2 つの関数を使用すると、中国語と英語が混在した文字列の占有率を共同で計算できます (中国語の文字の占有率は 2、英語の文字の占有率は

)

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

PHP の組み込み文字列長関数 strlen は、中国語の文字列を正しく処理できません。取得できるのは、文字列によって占有されているバイト数だけです。 GB2312 中国語エンコードの場合、strlen によって取得される値は中国語の文字数の 2 倍ですが、UTF-8 エンコードされた中国語の場合、その差は 3 倍になります (UTF-8 エンコードでは、1 つの中国語文字は 3 バイトを占めます)。

文字列の分割
substr() 関数はテキストを分割できますが、分割するテキストに漢字が含まれる場合、問題が発生することがよくあります。この場合は、mb_substr()/mb_strcut 関数を使用できます

mb_substr は文字を単語ごとに分割し、mb_strcut は文字をバイトごとに分割しますが、どちらも文字の半分を生成しません。


substr() 関数はテキストを分割できますが、分割するテキストに中国語の文字が含まれている場合は、mb_substr()/mb_strcut 関数を使用することができます。 substr() と似ていますが、mb_substr()/mb_strcut は文字列のエンコーディングを設定するために最後にパラメーターを 1 つ追加する必要があります。ただし、ほとんどのサーバーは php_mbstring.dll を php で開く必要があります。 .ini。

例:

コードは次のとおりです コードをコピー
echo mb_substr('こうすれば文字列は文字化けしません^_^', 0, 7, 'utf-8');
?>

出力: このように私の言葉

コードは次のとおりです コードをコピー
echo mb_strcut('こうすれば文字化けしません^_^', 0, 7, 'utf-8');
?>


出力: このようになります
上記の例からわかるように、mb_substr は文字を単語ごとに分割し、mb_strcut は文字をバイトごとに分割しますが、どちらも文字の半分を生成しません...

mbstring関数の説明:


PHP の mbstring 拡張モジュールは、マルチバイト文字の処理機能を提供します。最も一般的に使用される方法は、mbstring を使用してマルチバイトの中国語文字を分割することです。これにより、PHP の拡張機能であるため、パフォーマンスが向上します。また、一部のカスタム マルチバイト セグメンテーション関数よりも優れています。

mbstring 拡張機能には、同様の関数を備えたいくつかの関数、mb_substr および mb_strcut が用意されています。説明はマニュアルを参照してください。

mb_substr
mb_substr() は、start パラメーターと length パラメーターで指定された str の部分を返します。

mb_substr() は文字数に基づいてマルチバイトの安全な substr() 操作を実行します。位置は sqlserver/42852.htm target=_blank >最初の文字の位置は 0 です。2 番目の文字の位置は 1 です。

mb_strcut
mb_strcut() は、start パラメーターと length パラメーターで指定された str の部分を返します。

mb_strcut()はmb_substr()と同等の動作を別の方法で行いますが、開始位置がマルチバイト文字の2バイト目以上の場合はマルチバイト文字の1バイト目から開始されます。

長さより短い文字列と、マルチバイト文字列の一部ではない文字、またはシフトシーケンスの途中ではない文字を str から減算します。

別の例として、mb_substr と mb_strcut をそれぞれ使用してセグメント化されたテキストがあります。

プレーンテキスト

コード:


コードは次のとおりです $str = '私は中国語の比較的長い文字列-www.webjx.com';


echo "mb_substr:" . mb_substr($str, 0, 6, 'utf-8');

エコー "
";

echo "mb_strcut:" . mb_strcut($str, 0, 6, 'utf-8');

?>


出力結果は以下の通りです:
コードをコピー

mb_substr:私は比較の文字列です

mb_strcut:私は

です
テストコード:

コードは次のとおりです/**
コードをコピー
* 文字列分割 単語ごとに分割

* @param $content 文字列
* @param $length int
* @param $etc 文字列
* @戻り文字列
​*/
function Truncate($content, $length, $etc = '...') {

if ($length == 0) {

戻ります '';

} elseif (mb_strlen($content,'utf-8') > $length) {
$length -= min($length, mb_strlen($etc));
$charset = 'utf-8';
$content = mb_substr($content, 0, $length, $charset) . }
$content を返す;
}

$str ='ヴォルテール (1694~1778) フランスのブルジョワ啓蒙思想家、哲学者、歴史家、作家。ヴォルテールの元の名前はF.M. Arrouetでした。 ';

echo strlen($str);//文字列の長さ

echo '


'; Echo mb_strlen($str,'utf-8');//文字列の長さ

echo '


';
echo mb_strcut($str,0,35,'utf-8');//バイト単位で分割
echo '
';
echo mb_substr($str,0,35,'utf-8');//単語ごとに分割
echo '
';
echo Truncate($str,35);//文字列インターセプトメソッド


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/631281.html技術記事この記事では、strlen、mb_strlen、substr()、mb_substr()、mb_strcut の違いと使い方を詳しく紹介していますので、学習が必要な学生は参考にしてください。 mb_*の文字列分割関数の利用について:...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。