質問

今日、それはFALSE返したため、正しい結果が明らかに0であっても、私は1つのパラメータがUTF-8でエンコードされたので、これだったstrpos() PHP関数での問題に遭遇したが、他の(原点があるHTTP GETパラメータ)は明らかではない。

今、私がmb_strpos機能を使用すると、私の問題を解決していることに気づいています。

私の質問は今ある:それは賢明将来的には論文の問題を回避するために、一般的にPHPのマルチバイト文字列関数を使用することですか?私はすべての?

で機能など、など、strposstrlen、伝統的なeregを避ける必要があります

注意:PEARライブラリを使用している場合、これは他の問題につながるので、私は、設定しmbstring.func_overload php.iniのグローバルたくありません。私はPHP4を使用しています。

役に立ちましたか?

解決

これは、使用している文字エンコーディングに依存します。シングルバイト文字エンコーディング、またはUTF-8(文字の内部のシングルバイトが他の文字と間違われることはありません)で、その後、限り、あなたはで検索する文字列と、あなたが検索に使用した文字列と同じですエンコーディングあなたは通常の文字列検索機能を引き続き使用することができます。

あなたが他の文字のように表示された文字内の単一のバイトを防ぐことはできませんUTF-8以外のマルチバイトエンコーディングを使用している場合は、

、通常の文字列検索機能を使用して文字列の検索を行うことが安全なことはありません。あなたは偽陽性を見つけることができます。このようstrposなどの機能では、PHPの文字列比較は毎バイトであるので、これはであり、具体的にこの問題を回避するために設計されたUTF-8を除いて、マルチバイトエンコーディングは、文字で後続のバイトがで構成されたことを問題に苦しみます複数のバイトは、別の文字の一部と一致することがあります。

の文字列は、あなたが検索している場合は、の中に、あなたは別の文字エンコーディングのアールを探している文字列が、その後、変換が常に必要となります。そうしないと、他のエンコーディングでは異なって表現される任意の文字列のために、それは常にfalseを返すことを見つけることができます。あなたのアプリが使用する文字エンコーディングを決定し、アプリケーション内で一貫して:あなたは、入力のような変換を行う必要があります。あなたが別のエンコーディングで入力を受け取るときはいつでも、中に途中で変換します。

他のヒント

前5.2へのPHPのバージョンでMB_ *機能を持ついくつかの問題がありました。だからあなたのコードはPHPの異なるバージョンを持つ複数のプラットフォーム上で起こっている場合は、奇妙な動作が発生する可能性があります。さらにMB_ strpos関数は、内部で使用される実際のバイト位置を取得するためのオフセットパラメータで指定した文字数をスキップしなければならない、むしろ遅いです。 strpos / mb_strposの機能に応じたループでは、これは大きなボトルネックになることができます。

あなたはどこでも同じエンコーディングを使用する場合は、

それは一般的に問題ではありません。私はすべてのページにUTF-8を使用して、実際にこの問題が発生したことがありません。最終的にはそれが本当にページとデータベースの同じエンコーディングを指定するにダウンしています。

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

ほとんどの場合、これは、アプリケーションのすべてのデータソースが同じエンコーディングでデータをお届けしますので、あなたがこの種の問題を避けるだろうことを意味します。

それは完全なUnicodeサポートが含まれますので、

これはすべて、ところで、アドベントPHP 6ではるかに良いでしょう。

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

あなたはUTF-8をあなたのページがUTF-8で、フォームの提出は、UTF-8として解釈されていることを確認し、データベースに格納した場合、

、あなたは一般的にOKでしょう。 (特に切り詰め中)インデックス付き文字列操作が煩わしいが、一般的に悲惨ではないUTF-8シーケンスを、破ることができます。あなたがサポートのレベルを必要とした場合は、mb_stringsはあなたの唯一のオプションです(もちろん、あなたのアプリとライブラリとPHPのバージョンのすべての部分が適切に対処できることを確認する必要があり)ます。

PHPで正しくUnicodeを扱うサイトを開発、今あまりにも多くの楽しみではありません。そのUnicodeサポートは、Pythonと.NETなどの言語に比べて非常に貧弱です。 PHP6が事態を改善します期待されています。

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

http://sourceforge.net/projects/phputf8する

あなたのアプリケーションでそれをバンドルするmbstring拡張モジュールを必要としないことにより、アプリケーションの要件を緩めるが、あなたはまだUTF-8文字列関数を取得します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top