4

UTF-8 でエンコードされた長い文字列があるとします。

そして、この文字列に存在するかどうかを検出したいとし$varます。

$var常に単純な文字またはASCII文字の数字(例:)になると仮定すると"hello123"、使用する必要はありませんか?他の関数と一致している限り、位置が文字単位で正しくなくてもかまいません。mb_strposiconv_strpos

例:

$var='hello123';
$pos=strpos($utf8string,$var);
if ($pos!==false) $uptohere=substr($ut8string,0,$pos);

上記のコードは'hello123'、文字列に派手な UTF-8 文字が含まれているかどうかに関係なく、 までのすべてを抽出するというのは正しいですか? 私の論理は、 と の両方が互いに一貫しているためstrpos(substrこれが一貫して間違っている場合でも)、それでも機能するはずです。

4

2 に答える 2

10

はい。それで合っています。文字自体にあいまいさはありません。つまりhello123、UTF-8 では他に何もできない可能性があります。スライスする方法は、文字でスライスするか、バイト数でスライスするかは関係ありません。

そうです、文字列が UTF-8 であり、したがって ASCII 互換である限り、これは安全です。

簡単なテストについては、こちらを参照してください: http://3v4l.org/XnM8s

これが機能する理由:

UTF-8 の文字列 "漢字hello123" は、バイトとして次のようになります (これが正しく配置されることを願っています)。

e6 | bc | a2 | e5 | ad | 97 | 68 | 65 | 6c | 6c | 6f | 31 | 32 | 33
     漢      |      字      | h  | e  | l  | l  | o  | 1  | 2  | 3

strposバイト シーケンスを検索し、"hello123" の開始バイトとして68656c6c6f313233返します。byte から 6 バイトをスライスし、"漢字" を返します。あいまいさはありません。バイト単位で検索してスライスしています。文字数は関係ありません。6substr0

文字列で完全に動作する必要があります。その場合、文字列関数はエンコードを認識している必要があります。または、完全にbytesで作業します。この場合、唯一の要件は、バイトがあいまいでないことです (たとえば、「hello123」は BIG5 でエンコードされた「中国」と一致する可能性があります。これは、バイトが同じであるためです (一致しない、単なる例))。 )。UTF-8 はself-synchronizingです。つまり、そのようなあいまいさはありません。

于 2013-02-24T10:24:30.027 に答える
3

UTF-8 では、mb_* 関数を使用する必要があります。この場合、substr を次のように置き換える必要があります。

mb_substr($var, 0, N, 'UTF-8');

mb_substr()

于 2013-02-24T10:21:20.237 に答える