4

strpos()今日、正しい結果が明らかに0であってもFALSEを返したため、php関数で問題が発生しました。これは、一方のパラメーターがUTF-8でエンコードされたが、もう一方(originはHTTP GETパラメーター)が明らかにエンコードされなかったためです。

mb_strposこの関数を使用すると問題が解決したことに気づきました。

私の質問は今です:将来これらの問題を回避するために、PHPマルチバイト文字列関数を一般的に使用するのは賢明ですか?strpos従来のstrlen、、、eregなどの関数を完全に回避する必要がありますか?

mbstring.func_overload注意: PEARライブラリを使用すると他の問題が発生するため、php.iniでグローバルを設定したくありません。PHP4を使用しています。

4

5 に答える 5

4

5.2 より前のバージョンの PHP では、mb_ * 関数にいくつかの問題がありました。そのため、PHP のバージョンが異なる複数のプラットフォームでコードを実行すると、奇妙な動作が発生する可能性があります。さらに、mb_ strpos 関数はかなり遅く、offset パラメータで指定された文字数をスキップして、内部で使用される実際のバイト位置を取得する必要があります。strpos/mb_strpos 機能に依存するループでは、これが大きなボトルネックになる可能性があります。

于 2009-03-19T11:33:46.613 に答える
4

使用している文字エンコーディングによって異なります。1 バイト文字エンコーディングまたは UTF-8 (文字内の 1 バイトを別の文字と間違えることはありません) では、検索する文字列と検索に使用する文字列が同じである限り、エンコードすると、通常の文字列検索機能を引き続き使用できます。

UTF-8 以外のマルチバイト エンコーディングを使用している場合、文字内の 1 バイトが他の文字のように表示されることを妨げない場合、通常の文字列検索関数を使用して文字列検索を行うことは決して安全ではありません。誤検知が見つかる場合があります。これは、strpos などの関数での PHP の文字列比較がバイト単位であるためです。この問題を防ぐために特別に設計された UTF-8 を除いて、マルチバイト エンコーディングでは、文字の後続のバイトが複数のバイトが異なる文字の一部と一致する場合があります。

検索する文字列と検索する文字列の文字エンコーディングが異なる場合は、常に変換が必要になります。そうしないと、他のエンコーディングでは異なる方法で表現される文字列に対して、常に false が返されることがわかります。入力時にこのような変換を行う必要があります。アプリで使用する文字エンコーディングを決定し、アプリケーション内で一貫性を保ちます。異なるエンコーディングで入力を受け取るときはいつでも、途中で変換してください。

于 2009-03-19T11:37:54.433 に答える
2

どこでも同じエンコーディングを使用しても、通常は問題ありません。私はすべてのページで UTF-8 を使用していますが、実際にこの問題に遭遇したことはありません。最終的には、ページとデータベースに同じエンコーディングを指定することになります。

例えば:

header('Content-type: text/html;charset=utf-8');
mysql_query('SET NAMES utf8');

ほとんどの場合、これは、アプリケーションのすべてのデータ ソースが同じエンコーディングでデータを配信することを意味するため、この種の問題を回避できます。

PHP 6 の登場により、Unicode が完全にサポートされるため、これはすべて大幅に改善されます。

于 2009-03-19T11:36:37.590 に答える
1

必ずしも mb_strpos を使用する必要はありませんが、アプリ内のすべてのデータが同じであることを確認する必要があります: mb_string、または特定のエンコーディングのプレーン文字列のいずれかです。(通常は UTF-8 です。)

ページが UTF-8 であることを確認し、フォーム送信が UTF-8 として解釈され、データベースに UTF-8 が保存されている場合、通常は問題ありません。インデックス付き文字列操作 (特に切り捨て) は、UTF-8 シーケンスを壊す可能性があります。これは煩わしいですが、一般的に悲惨なことではありません。そのレベルのサポートが必要な場合は、mb_strings が唯一のオプションです (ただし、もちろん、アプリとライブラリのすべての部分と PHP バージョンがそれらに適切に対応できることを確認する必要があります)。

PHP で Unicode を正しく処理するサイトを開発することは、今のところあまり楽しいことではありません。PHP の Unicode サポートは、Python や .NET などの言語に比べて非常に貧弱です。PHP6 で問題が改善されることが期待されます。

于 2009-03-19T11:35:25.597 に答える
0

次の PHP UTF-8 ライブラリを使用することをお勧めします。

http://sourceforge.net/projects/phputf8

これをアプリケーションにバンドルすると、mbstring 拡張機能が不要になるため、アプリケーションの要件が緩和されますが、UTF-8 文字列関数を取得できます。

于 2009-03-19T22:18:35.977 に答える