PHPでUnicodeを検索するストップ(およびインラインUTF-8の処理)
-
30-09-2019 - |
質問
私は、UTF-8である場合とそうでない場合がある別の文字列(ヘイスタック)内の2文字のユニコード文字列(針)の簡単な検索に問題があります
問題の一部は、で使用するためのコードを指定する方法がわからないことです strpos
, 、そして、PHPをコードの特別なサポートでコンパイルする必要があるかどうか、または使用する必要があるかどうかはわかりません mb_strpos
それも利用できないかもしれないので、私は避けようとしています。
すなわち。たとえば、針はです U+56DE U+590D
(スペースなし)
preg_matchでそれはそうかもしれません preg_match("@\x{56DE}\x{590D}@",$haystack)
しかし、それは実際に必要です @u
利用できない可能性があり、私は取得します Compilation failed: character value in \x{...} sequence is too large
とりあえず。
とにかくpreg_matchを使用したくありません。それはstrposよりも大幅に遅くなる可能性があるためです(検索する必要がある他のシーケンスがあります)。
変換できますか U+56DE U+590D
単一のバイトシーケンス(おそらく5〜6文字)に入り、STRPOSで検索しますか? もしそうなら、それをバイトに変換する方法を理解できません。
とにかくPHPでユニコードインラインをどのように指定しますか?私はPRCE以外のことですか?
$blah="\u56DE\u590D";
うまくいきませんか?
アイデアをありがとう!
解決
まず、あなたの質問の構造は不十分です。いくつかの点でいくつかの質問があります。より明確な構造を使用した場合、おそらくより多くの回答を得るでしょう:1)達成しようとしているタスク、2)制限/要件、3)検討した戦略、4)そのような戦略で見つけた困難/より良いものはありますか。
そうは言っても、私は最後まで始めます:
$blah="\u56DE\u590D";
うまくいきませんか?
いいえ。言語はUnicodeについて何も知りません。 PHPでは、文字列はバイト配列です。したがって、PHPスクリプトでUnicodeコードポイントを表現する方法は、使用するエンコードに依存します。 UTF-8の場合、そうでしょう "\xE5\x9B\x9E\xE5\xA4\x8D"
, 、UTF-16のビッグエンディアンはそうでしょう "\x56\xDE\x59\x0D"
, 、 等々。
変換できますか
U+56DE U+590D
その単一のバイトシーケンス(おそらく5〜6文字)に入り、それを介してそれを検索しますstrpos
?もしそうなら、それをバイトに変換する方法を理解できません。
なぜなら、最初の部分、はい、つまり、変換 U+56DE U+590D
バイトには、説明が必要です。これらのUTF-16コードユニットまたはUnicodeコードポイントですか?たとえば、どうですか 𪛖
表現? U+D869 U+uDED6
また U+2A6D6
?それらがUnicodeコード単位である場合、それらをUTF-16にエンコードするのは簡単です。 UTF-16 Big Endianの場合、それはただです "\x56\xDE\x59\x0D"
. 。それ以外の場合は、UTF-32をエンコードするのはまだ些細なことですが、UTF-16(またはUTF-8)で同じことをするにはもう少し作業が必要です。
2番目の部分については、読み続けてください。
問題の一部は、で使用するためのコードを指定する方法がわからないことです
strpos
, 、そして、PHPをコードの特別なサポートでコンパイルする必要があるかどうか、または使用する必要があるかどうかはわかりませんmb_strpos
それも利用できないかもしれないので、私は避けようとしています。
あなたは何をしようとしているのですか?なぜ文字列内の位置を見つける必要があるのですか? strpos
特定の文字列のバイトオフセットを提供します(再び、バイナリ形式で解釈されます)。文字列をクリップしようとしていますか? strpos
(あるいは mb_strpos
)ユニコードの平均問題 - グリフはいくつかのコード単位で構成される可能性があるため、グリフの一部をクリップするリスクがあります。あなたが何をしようとしているのかを言わない限り、私はあなたにこれ以上助言することはできません。
他のヒント
「利用できないかもしれない」と書いた。試してみることをお勧めします MB_STRPOS.