PHP の文字化けトリムは、PHP の文字列関数がデフォルトでマルチバイトセーフではないために発生します。解決策は、mb_trim 関数をカプセル化して文字化けを解決することです。
#この記事の動作環境: Windows 7 システム、PHP バージョン 7.4、Dell G3 コンピューター。
PHP トリム文字化けの問題を解決するにはどうすればよいですか?
PHP の Trim は文字化けをインターセプトします
常に Trim を使用して文字列の両端をフィルタリングします。Trim の公式説明:
trim —文字列の先頭と末尾にある空白文字 (またはその他の文字) を削除します。
今日、非常に奇妙な問題を見つけました。コードは次のとおりです。
<?php $str = '研发、产品、'; echo trim($str, '、');
これが何を返すかわかりますか? 「開発製品」?いや、これは奇しくも「研究開発と生産」に戻りました。
開き方が間違っているのでしょうか?文字化けが返されるのはなぜでしょうか?
いくつかのテストの後、非常に興味深い問題を発見しました。
<?php echo trim('abacabb', 'ab'); //print 'c'
当初は acabb が返されると思っていましたが、c しか返されませんでした。これはトリム機能の誤解です。
実は、この例は公式ドキュメントに記載されていますが、私は注意を払いませんでした。
trim は文字列の最初の文字をループします。上記の例と同様に、実行プロセスは次のようになります。
文字列 abacabb は添字 0 からループを開始します。 ab 内の文字が存在する場合は削除され、存在しない場合はループが停止します。文字。
したがって、実行は次のようになります:
ループ a が文字列 ab に存在するので、それを削除し、bacabb を残します
ループ b文字列 ab に存在する場合は、 acabb
ループを残して削除します。 文字列 ab に存在する場合は、cabb
ループ c を残して削除します。これは文字列 ab に存在し、ループを停止するため、最初の文字を削除した後に残るのは cabb です。
ただし、trim は最初と最後の文字をフィルタリングするため、ループ内の末尾からも削除されます。
ループ b は文字列 ab に存在します。削除してください。残りの cab は次のとおりです。
ループ b は文字列 ab に存在します。削除してください。 、残りの ca、
ループ a は文字列 ab に存在し、それを削除して c を残します、
ループ c は文字列に存在しませんab、ループを停止するため、終端文字を削除すると次のようになります。
つまり、すべてが終わった後、abacabb には c が残ります。ここでトリム機能についてある程度理解できたと思います。
さて、文字化けしたコードの問題について話しましょう。なぜ文字化けしたコードが返されるのでしょうか?
これは、PHP では文字列関数がデフォルトではマルチバイトセーフではないためです。マルチバイトセーフが必要な場合は、mb_ シリーズの関数を使用する必要があります。
「,」の 16 進コードは 0xe3 0x80 0x81 です。マルチバイト セーフではない関数では 3 文字として扱われます。
「品」の 16 進コードは 0xe5 0x93 0x81 です。ここの最後の 0x81 は一致するだけでフィルタリングされます。文字化けの原因となります。
わかりました。問題が見つかりました。trim には mb 関数がありませんが、自分でカプセル化できます。 関数mb_trim。
追記: 私は長い間トリムを使ってきましたが、まったく理解していませんでした。公式ドキュメントを読むことは依然として重要です。
推奨学習: 「PHP ビデオ チュートリアル 」
以上がPHP+Trim文字化け問題の解決方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。