11

はい、知っています。マルチバイト文字を使用する場合は、mb_*関数を使用する必要があります。しかし、strposを使用している場合はどうでしょうか。このコードを見てみましょう(utf-8に保存されています)

var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23)

mb_strposの使用には違いがありますか?これを同じ仕事にしませんか?結局のところ、strposは文字列(複数バイト)を探しませんか?代わりにstrposを使用する理由はありますか?

4

3 に答える 3

16

UTF-8 の場合、バイト シーケンスの一致は、文字シーケンスの一致とまったく同じです。

したがって、両方ともまったく同じポイントで針を見つけますが、針のmb_strposの完全な UTF-8 バイト シーケンスをカウントします。ここで、asは任意のバイトを計算します。したがって、文字列に別のマルチバイト UTF-8 シーケンスがある場合、結果は異なります。strpos

strpos("My symbolö utf-8 is the €.", "€") !== mb_strpos("My symbolö utf-8 is the €.", "€", 0, "UTF-8")

しかし:

strpos("My symbol utf-8 is the €.", "€") === mb_strpos("My symbol utf-8 is the €.", "€", 0, "UTF-8")
于 2012-12-17T12:04:31.040 に答える
7

使用している文字セットと検索する文字列に応じて、これによって違いが生じる場合とそうでない場合があります。

strpos()針として渡されるバイトシーケンスを探します。

mb_strpos()同じことをします、文字の境界も尊重します。

したがってstrpos()、バイトシーケンスが文字列のどこかにある場合に一致します。mb_strpos()バイトシーケンスが完全な文字の有効なセットも表す場合にのみ一致します。

于 2012-12-17T11:40:05.147 に答える