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 回答
3

我发现上面的例子不是完全透明的,一些用户可能会感到困惑。

mb_string()应该用于多字节编码,什么是您在其他问题中解释的多字节编码,例如这里

最近我们在这个例子中主要使用 UTF 编码UTF-8(也是UTF-16),它是多字节字符集,但是通常我们只使用 ASCII 字符集(例如英语),并且它们的结果strposmb_strpos是相同的。

当我们使用多字节字符,即汉字时,差异是显而易见的。

echo mb_internal_encoding(); //UTF-8

echo strpos('我在买绿茶', '在'); //3

echo mb_strpos('我在买绿茶', '在'); //1

所以显然它适用于汉字,也适用于一些人不知道的表情符号。

为了更广泛地了解它是如何工作的,我用strlen()mb_strlen()函数显示了以下字符串的长度。

echo strlen('我在买绿茶'); //15

echo mb_strlen('我在买绿茶'); //5
于 2020-09-25T22:17:24.267 回答