是的,我知道。当我们使用多字节字符时,我们应该使用 mb_* 函数。但是当我们使用 strpos 时呢?我们来看看这段代码(以utf-8保存)
var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23)
使用mb_strpos有区别吗?不会使这项工作成为相同的工作吗?毕竟,strpos不是在寻找一个字符串(多字节)吗?有理由使用 strpos 吗?
对于 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")
根据使用的字符集和正在搜索的字符串,这可能会或可能不会有所不同。
strpos()
查找作为指针传递的字节序列。
mb_strpos()
做同样的事情,但它也尊重字符边界。
strpos()
如果字节序列出现在字符串中的任何位置,那么将匹配。mb_strpos()
仅当字节序列也表示一组有效的完整字符时才会匹配。
我发现上面的例子不是完全透明的,一些用户可能会感到困惑。
mb_string()
应该用于多字节编码,什么是您在其他问题中解释的多字节编码,例如这里。
最近我们在这个例子中主要使用 UTF 编码UTF-8
(也是UTF-16
),它是多字节字符集,但是通常我们只使用 ASCII 字符集(例如英语),并且它们的结果strpos
和mb_strpos
是相同的。
当我们使用多字节字符,即汉字时,差异是显而易见的。
echo mb_internal_encoding(); //UTF-8
echo strpos('我在买绿茶', '在'); //3
echo mb_strpos('我在买绿茶', '在'); //1
所以显然它适用于汉字,也适用于一些人不知道的表情符号。
为了更广泛地了解它是如何工作的,我用strlen()
和mb_strlen()
函数显示了以下字符串的长度。
echo strlen('我在买绿茶'); //15
echo mb_strlen('我在买绿茶'); //5