2

UTF-8 である場合とそうでない場合がある別の文字列 (干し草の山) 内の 2 文字の Unicode 文字列 (針) の単純な検索の処理に問題があります。

問題の一部は、 で使用するコードを指定する方法がわからないことと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 よりもかなり遅くなる可能性があるため、使用したくありません (検索する必要がある他のシーケンスがあります)。

1 バイト シーケンス (おそらく 5 ~ 6 文字)に変換U+56DE U+590Dし、strpos を介して検索できますか? もしそうなら、それをバイトに変換する方法がわかりません。

とにかく、PHPでインラインでユニコードを指定するにはどうすればよいですか? PRCEの外ということですか?

$blah="\u56DE\u590D"; 動作しませんか?

アイデアをありがとう!

4

2 に答える 2

3

まず、質問の構成が不十分です。いくつかの点でいくつかの質問があります。より明確な構造を使用すると、おそらくより多くの回答が得られるでしょう: 1) 達成しようとしているタスクの説明、2) 制限/要件、3) 検討した戦略、4) そのような戦略で見つけた困難/より良いものはありますか。

そうは言っても、私は最後まで始めます:

$blah="\u56DE\u590D";動作しませんか?

いいえ、言語はユニコードについて何も知りません。PHP では、文字列はバイト配列です。したがって、PHP スクリプトで Unicode コード ポイントを表現する方法は、使用するエンコーディングによって異なります。UTF-8 の場合は"\xE5\x9B\x9E\xE5\xA4\x8D"、UTF-16 ビッグ エンディアンの場合"\x56\xDE\x59\x0D"は などになります。

1 バイト シーケンス (おそらく 5 ~ 6 文字)に変換U+56DE U+590Dしてから検索できstrposますか? もしそうなら、それをバイトに変換する方法がわかりません。

最初の部分については、はい、つまり、U+56DE U+590Dバイトへの変換については、明確化が必要です。これらは UTF-16 コード単位ですか、それとも Unicode コード ポイントですか? たとえば、どのように表されますか。U+D869 U+uDED6またはU+2A6D6?それらが Unicode コード単位である場合、それらを UTF-16 にエンコードするのは簡単です。UTF-16 ビッグ エンディアンの場合は、"\x56\xDE\x59\x0D". それ以外の場合、それらを UTF-32 にエンコードするのは簡単ですが、UTF-16 (または UTF-8) で同じことを行うにはもう少し手間がかかります。

2番目の部分については、読み続けてください。

問題の一部は、 で使用するコードを指定する方法がわからないこととstrpos、コードの特別なサポートを使用して PHP をコンパイルする必要があるかどうか、または使用mb_strposしようとしているものを使用する必要があるかどうかがわからないことです。利用できない場合もありますので避けてください。

あなたは何をしようとしているのですか?文字列内の位置を見つける必要があるのはなぜですか? strpos指定された文字列のバイトオフセットを提供します(これもバイナリ形式で解釈されます)。文字列をクリップしようとしていますか? strpos(またはmb_strpos) は Unicode の問題を意味します。グリフは複数のコード単位で構成される可能性があるため、グリフの一部をクリッピングする危険があります。あなたが何をしようとしているのかを言わない限り、私はあなたにこれ以上アドバイスすることはできません.

于 2010-08-23T19:47:42.577 に答える
1

あなたは「利用できないかもしれない」と書きました。mb_strposを試すことをお勧めします。

于 2010-08-23T08:26:16.070 に答える