是的:我知道。当我们使用multibyte char时,我们应该使用mb_ *函数。但是当我们使用strpos时? 我们来看看这段代码(保存在utf-8中)
var_dump(strpos("My symbol utf-8 is the €.", "\xE2\x82\xAC")); // int(23)
使用mb_strpos有区别吗?是不是让这项工作成绩相同?毕竟,不是 strpos 寻找一个字符串(多个字节)?是否有理由使用strpos?
答案 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字符集(例如,英语)和结果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