ホームページ >バックエンド開発 >PHPチュートリアル >PHP で substr() を使用して文字列をインターセプトするときに中国語の文字化けが表示される場合はどうすればよいですか?_PHP チュートリアル
PHPのプログラム開発では、情報のリストを出力する場合など、文字列のインターセプト操作が頻繁に行われます。 、タイトルは長すぎてはならず、記事を印刷する 要約するときは、一連の文字列インターセプト操作も実行する必要があります。これらの要件に遭遇した場合、それを実現するために substr() メソッドを使用することをよく考えますが、すべて英語の文字列をインターセプトするには substr() の方が適しています。
ただし、文字列に中国語の文字が含まれている限り、PHP substr 中国語の文字化けが発生する可能性があります。これは、中国語の UTF-8 エンコーディングでは、各漢字が 3 バイトを占有するのに対し、GB2312 は 2 バイト、英語は 1 バイト、およびインターセプト数字が占有されるためです。は正確ではありません。substr() は中国語の文字を強制的に半分に「切断」し、壊れた文字が次の文字を引っ張って単語を作成するため、PHP substr の中国語の文字化けが表示されます。
substr --- 文字列の一部を取得します
構文: string substr (string string, int start [, int length])
説明:
substr() は、パラメータ start と length で指定された文字列の一部を返します。
start が正の数の場合、返される文字列は string の開始文字から始まります。
例:
リーリーstart が負の数の場合、返される文字列は文字列の末尾の開始文字から始まります。
例:
リーリーパラメータの長さが指定されており、それが正の数である場合、返される文字列は先頭からの長さの文字になります。
length パラメーターが指定され、それが負の数値である場合、返される文字列は、文字列の末尾から length 番目の文字で終了します。
例:
リーリー英語は問題ありません。中国語でテストします
文字をインターセプトした結果は、明らかに私たちが望んでいる結果ではありません。このような中国語の PHP substr の状況により、プログラムが正常に実行できなくなる可能性があります。主な解決策は 2 つあります:
1. mbstring拡張ライブラリのmb_substr()を使用してインターセプトすると文字化けが発生しません。
関数 mb_substr()/mb_strcut() を使用できます。mb_substr()/mb_strcut() の使用法は、mb_substr()/mb_strcut の最後にパラメータを 1 つ追加する必要があることを除いて、substr() と似ています。ただし、ほとんどのサーバーは php_mbstring.dll を開きません。php.ini で php_mbstring.dll を開く必要があります。
リーリー最後のエンコーディングパラメータが指定されていない場合、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 長さ単位になります。
substr は時々中国語の 1/3 または半分が切り取られ、文字化けして表示されます。比較的、mb_substr の方が使いやすいです。ただし、mb_substr は使いにくい場合があります。たとえば、小さな画像の簡単な情報を表示したい場合は、漢字 5 文字がちょうどいいです。それ以上の場合は、最初の 4 文字を切り取って「...」を追加するだけで問題ありません。中国語ですが、英語や数字を処理する場合、このインターセプトは短すぎます。
2 番目に、インターセプト関数を自分で作成しますが、効率は mbstring 拡張ライブラリを使用するほど高くありません。以下は、UTF-8 でエンコードされた文字列をインターセプトする ecshop の関数です。
リーリーこの記事の説明はこれですべてです。上記のコードも非常に簡単です。わからないことがあれば、メッセージを残してください。できるだけ早く。