#この記事の動作環境: Windows7 システム、PHP8 バージョン、DELL G3 パソコンPHP プログラム開発では、文字列インターセプトが頻繁に行われます。たとえば、情報のリストを出力する場合、タイトルは長すぎてはいけませんし、記事の概要を出力する場合は、一連の文字列インターセプト操作も実行する必要があります。これらの要件に遭遇した場合、それを実現するために substr() メソッドを使用することをよく考えますが、すべて英語の文字列をインターセプトするには substr() メソッドの方が適しています。 しかし、文字列に中国語の文字が含まれている限り、PHP substr の中国語文字化けが発生する可能性があります。これは、中国語の UTF-8 エンコーディングでは、各中国語文字が 3 バイトを占有するのに対し、GB2312 は 2 バイト、英語は 1 バイトを占有するためです。 byte 、インターセプトされた桁数が正確ではない、substr() は中国語の文字を突然半分に「切断」し、壊れた文字が次の文字を引っ張って単語を作成するため、PHP substr 中国語の文字化けが表示されます。php substr インターセプト文字列が文字化けする解決策: 1. mbstring 拡張ライブラリの「mb_substr()」を使用して、構文「mb_substr(string, 開始位置, 文字長, "文字エンコーディング")」をインターセプトします。 2. ecshop の関数を使用して、UTF-8 でエンコードされた文字列をインターセプトします。
substr --- 文字列の一部を取得
構文:string substr (string string, int start [, int length])
<?php $rest = substr ("abcdef", 1); // returns "bcdef" $rest = substr ("abcdef", 1, 3); // returns "bcd" ?>start が負の数の場合、返される文字列は文字列の末尾の開始単語から始まります。
<?php $rest = substr ("abcdef", -1); // returns "f" $rest = substr ("abcdef", -2); // returns "ef" $rest = substr ("abcdef", -3, 1); // returns "d" ?>パラメータの長さが指定されており、それが正の数である場合、返される文字列は先頭からの長さの文字が返されます。
パラメータの長さが指定され、それが負の数値である場合、返される文字列は文字列の末尾の長さ 番目の文字で終了します。
<?php $rest = substr ("abcdef", 1, -1); // returns "bcde" ?>英語は問題ありません。中国語をテストします
<?php $rest = substr ("中国人", 1, -1); // returns "fdsafsda" 就是乱码了 ?>文字をインターセプトした結果は、明らかに私たちが望む結果ではありません。これは PHP で表示されます。 substr の中国語文字化けにより、プログラムが正常に動作しなくなる可能性があります。
1. mbstring 拡張ライブラリの mb_substr() を使用してインターセプトし、文字化けが発生しないようにします。
関数 mb_substr()/mb_strcut() を使用できます。mb_substr()/mb_strcut() の使用法は、複数の行を追加する必要があることを除いて、substr() と似ています。 mb_substr()/mb_strcut の終わり。文字列のエンコーディングを設定するパラメータですが、ほとんどのサーバーは php_mbstring.dll を開きません。php.ini で php_mbstring.dll を開く必要があります。<?php echo mb_substr("php中文字符encode",0,4,"utf-8"); ?>最後のエンコードパラメータが指定されていない場合、3バイトを漢字1文字として扱います。これがutf-8エンコードの特徴です。utf-8文字セットの記述を追加すると、 1 文字。ユニットに対してインターセプトされます。 利用する際はphpファイルのエンコードとWebページ表示時のエンコードに注意してください。この mb_substr メソッドを使用するには、事前に文字列のエンコーディングを知っておく必要があります。エンコーディングがわからない場合は、判断する必要があります。mbstring ライブラリには、文字列のエンコーディングをチェックするための mb_check_encoding も提供されていますが、まだ完全ではありません。 PHP にはいくつかの文字列インターセプト関数が付属しており、その中で、substr と mb_substr がよく使用されます。前者が中国語を処理する場合、GBK は 2 長さ単位、UTF は 3 長さ単位となり、後者でエンコーディングを指定すると、1 つの中国語文字が 1 長さ単位になります。
次に、インターセプト関数を自分で作成しますが、効率は mbstring 拡張ライブラリを使用するほど高くありません。以下は、UTF-8 でエンコードされた文字列をインターセプトする ecshop の関数です。
function sub_str($str, $length = , $append = true) { $str = trim($str); $strlength = strlen($str); if ($length == || $length >= $strlength) { return $str; //截取长度等于或大于等于本字符串的长度,返回字符串本身 } elseif ($length < ) //如果截取长度为负数 { $length = $strlength + $length;//那么截取长度就等于字符串长度减去截取长度 if ($length < ) { $length = $strlength;//如果截取长度的绝对值大于字符串本身长度,则截取长度取字符串本身的长度 } } if (function_exists('mb_substr')) { $newstr = mb_substr($str, , $length, EC_CHARSET); } elseif (function_exists('iconv_substr')) { $newstr = iconv_substr($str, , $length, EC_CHARSET); } else { //$newstr = trim_right(substr($str, , $length)); $newstr = substr($str, , $length); } if ($append && $str != $newstr) { $newstr .= '...'; } return $newstr; }わかりました。この記事の説明はこれですべてです。これで何かが得られると思います。上記のコードも非常に単純です。わからないことがあれば、そのままにしておいてください。できるだけ早く全員に返信します。 推奨学習: 「
PHP ビデオ チュートリアル 」
以上がphp substr が文字化けした文字列をインターセプトした場合の対処方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。