mb_strpos vs strpos,有什么区别?

时间:2012-12-17 11:37:12

标签: php utf-8 strpos

是的:我知道。当我们使用multibyte char时,我们应该使用mb_ *函数。但是当我们使用strpos时? 我们来看看这段代码(保存在utf-8中)

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

使用mb_strpos有区别吗?是不是让这项工作成绩相同?毕竟,不是 strpos 寻找一个字符串(多个字节)?是否有理由使用strpos?

3 个答案:

答案 0 :(得分:12)

对于UTF-8,匹配字节序列与匹配字符序列完全相同。

因此,他们都会在完全相同的点找到针,但mb_strpos计算针之前的完整UTF-8字节序列,其中strpos计算任何字节。因此,如果您的字符串具有另一个多字节UTF-8序列,则结果会有所不同:

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")

答案 1 :(得分:6)

根据使用的字符集和搜索的字符串,这可能会有所不同。

strpos()查找作为指针传递的字节序列。

mb_strpos()做同样的事情但是它也尊重字符边界。

如果字节序列出现在字符串中的任何位置,那么strpos()将匹配。 mb_strpos()只有在字节序列也代表一组有效的完整字符时才会匹配。

答案 2 :(得分:0)

我发现上述示例并非完全透明,某些用户可能会感到困惑。

mb_string()应该用于多字节编码,在其他问题(例如, here

最近,在此示例中,我们大多使用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